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;
}
浙公网安备 33010602011771号