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; }