http://acm.timus.ru/problem.aspx?space=1&num=1434
将每一条线路 看成一个点 有共同站点的线路连一条边 并记录是那个共同站点 由于可能有多个共同站点 为了节约内存 应该避免建重边
拥有出发站点的线路可以作为搜索的起点 拥有终点站点的线路可以是搜索的终点 这样的话用来搜索起点和终点就有多个了
然后一遍bfs 最先搜到的终点 为最近 然后注意记录路径
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> #include<vector> #include<stack> #include<set> #include<map> #include<queue> #include<algorithm> #include<cmath> #define LL long long #define sint short int //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int N=100005; const int M=2000005; const int K=1005; int head[K],I; struct node { int j,next; int k; }side[M]; bool dist[K]; bool L[K][K]; int f[K],kf[K]; bool nd[K]; vector< int >road; queue< int >qt; vector< int >link[N]; void add( int i, int j, int k) { if (L[i][j]== true ) return ; L[i][j]= true ; side[I].j=j; side[I].next=head[i]; side[I].k=k; head[i]=I++; } void init( int n, int m) { memset (head,-1, sizeof (head)); memset (L, false , sizeof (L)); I=0; for ( int i=1;i<=m;++i) link[i].clear(); for ( int i=1;i<=n;++i) { int tmp; cin>>tmp; while (tmp--) { int k; cin>>k; for (unsigned j=0;j<link[k].size();++j) { if (link[k][j]==i) break ; add(link[k][j],i,k);add(i,link[k][j],k); } link[k].push_back(i); } } } int bfs( int n) { int flag=0; while (!qt.empty()) { int x=qt.front();qt.pop(); if (nd[x]== true ) {flag=x; break ;} for ( int t=head[x];t!=-1;t=side[t].next) { int j=side[t].j; if (dist[j]== false ) { dist[j]= true ; f[j]=x; kf[j]=side[t].k; qt.push(j); } } } if (flag) { int k=flag; while (f[k]!=-1) { road.push_back(kf[k]); k=f[k]; } } return flag; } int main() { //freopen("data.in","r",stdin); int n,m; cin>>n>>m; init(n,m); int x1,x2; cin>>x1>>x2; if (x1==x2) {cout<< "0" <<endl;cout<<x1<<endl; return 0;} memset (dist, false , sizeof (dist)); memset (f,-1, sizeof (f)); memset (nd, false , sizeof (nd)); for (unsigned int i=0;i<link[x1].size();++i) {dist[link[x1][i]]= true ;qt.push(link[x1][i]);} for (unsigned int i=0;i<link[x2].size();++i) {nd[link[x2][i]]= true ;} if (!bfs(n)) {cout<< "-1" <<endl; return 0;} road.insert(road.begin(),x2); cout<<road.size()<<endl; cout<<x1; for ( int i=road.size()-1;i>=0;--i) cout<< " " <<road[i]; cout<<endl; return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步