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 }