题意:给出人际关系网络,求一个人要寻到另一个人需要经过的最少中间人数。
题解:裸的最短路。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005,M=N*100,inf=0x3f3f3f3f; 6 int head[N],nc,list[N],f,r,dist[N],vis[N]; 7 struct Edge 8 { 9 int to,next; 10 }edge[M]; 11 void add(int a,int b) 12 { 13 edge[nc].to=b;edge[nc].next=head[a];head[a]=nc++; 14 } 15 void spfa(int s) 16 { 17 memset(vis,false,sizeof(vis)); 18 memset(dist,0x3f,sizeof(dist)); 19 vis[list[f=0]=s]=true,r=1; 20 dist[s]=0; 21 while(f!=r) 22 { 23 int now=list[f++]; 24 if(f==N)f=0; 25 vis[now]=false; 26 for(int i=head[now];i!=-1;i=edge[i].next) 27 { 28 int to=edge[i].to; 29 if(dist[to]>dist[now]+1) 30 { 31 dist[to]=dist[now]+1; 32 if(!vis[to]) 33 { 34 vis[list[r++]=to]=true; 35 if(r==N)r=0; 36 } 37 } 38 } 39 } 40 } 41 int main() 42 { 43 int n; 44 while(scanf("%d",&n)!=EOF) 45 { 46 memset(head,-1,sizeof(head)); 47 nc=0; 48 for(int i=0;i<n;i++) 49 { 50 int id,nc,to; 51 scanf("%d%d",&id,&nc); 52 while(nc--) 53 { 54 scanf("%d",&to); 55 add(id,to); 56 } 57 } 58 int a,b; 59 scanf("%d%d",&a,&b); 60 spfa(a); 61 printf("%d %d %d\n",a,b,dist[b]-1); 62 } 63 return 0; 64 }