题意:给出人际关系网络,求一个人要寻到另一个人需要经过的最少中间人数。

题解:裸的最短路。

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 }