POJ 2781

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

题解:裸的最短路。

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 }

你可能感兴趣的:(poj)