HDU 4460 Friend Chains(SPFA+邻接表)

题目链接

其实这是我第一次敲邻接表+spfa,暑假的时候做过很多spfa题目,我一个没切,从头学起啊。。。切这个题,纯为熟悉模版。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <map>
 6 using namespace std;
 7 #define N 100000000
 8 int d[1001],in[1001],first[2001],t;
 9 map <string,int> na;
10 struct node
11 {
12     int w,u,v,next;
13 }gra[20001];
14 void init()
15 {
16     t = 1;
17     memset(first,-1,sizeof(first));
18 }
19 void add(int u,int v,int w)
20 {
21     gra[t].u = u;
22     gra[t].v = v;
23     gra[t].w = 1;
24     gra[t].next = first[u];//交换头指针
25     first[u] = t;
26     t ++;
27 }
28 int main()
29 {
30     int i,j,n,m,x,ans;
31     char s1[11],s2[11];
32     while(scanf("%d",&n)!=EOF)
33     {
34         if(n == 0) break;
35         na.clear();
36         init();
37         for(i = 1; i <= n; i ++)
38         {
39             scanf("%s",s1);
40             na[s1] = i;
41         }
42         scanf("%d",&m);
43         t = 1;
44         for(i = 1; i <= m; i ++)
45         {
46             scanf("%s%s",s1,s2);
47             add(na[s1],na[s2],1);
48             add(na[s2],na[s1],1);
49         }
50         queue<int> que;
51         ans = -1;
52         for(j = 1; j <= n; j ++)
53         {
54             for(i = 1; i <= n; i ++)
55             {
56                 d[i] = N;
57                 in[i] = 0;
58             }
59             que.empty();
60             que.push(j);
61             d[j] = 0;
62             in[j] = 1;
63             while(!que.empty())
64             {
65                 x = que.front();
66                 que.pop();
67                 in[x] = 0;
68                 for(i = first[x]; i != -1;i = gra[i].next)
69                 {
70                     if(d[gra[i].v] > d[x]+gra[i].w)
71                     {
72                         d[gra[i].v] = d[x]+gra[i].w;
73                         if(!in[gra[i].v])
74                         {
75                             que.push(gra[i].v);
76                             in[gra[i].v] = 1;
77                         }
78                     }
79                 }
80             }
81             for(i = 1;i <= n;i ++)
82             {
83                if(ans < d[i])
84                {
85                    ans = d[i];
86                }
87             }
88         }
89         if(ans == N)
90         printf("-1\n");
91         else
92         printf("%d\n",ans);
93     }
94     return 0;
95 }
posted @ 2012-11-16 21:37  Naix_x  阅读(170)  评论(0编辑  收藏  举报