USACO 3.2 Sweet Butter(SPFA)
和杭州赛区那个求最短路中的最长路很类似,悲剧的是模版一个地方给敲错了,很细小的错误,我检查了N遍,中间写了floyd,测试一下题意。。WA的都麻木了,这模版敲的很不熟啊。。。
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: butter 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <queue> 10 using namespace std; 11 #define INF 0x3f3f3f3f 12 int first[1001],cow[1001],t,p,d[1001],in[801]; 13 int dis[801][801]; 14 queue<int> que; 15 struct node 16 { 17 int u,v,w,next; 18 }edge[5001]; 19 void CL() 20 { 21 t = 1; 22 memset(first,-1,sizeof(first)); 23 } 24 void add(int u,int v,int w) 25 { 26 edge[t].u = u; 27 edge[t].v = v; 28 edge[t].w = w; 29 edge[t].next = first[u]; 30 first[u] = t; 31 t ++; 32 } 33 void spfa(int str)//以后变量的统统都是这样写了。 34 { 35 int i,v,u; 36 for(i = 1;i <= p;i ++) 37 { 38 in[i] = 0; 39 d[i] = INF; 40 } 41 que.push(str); 42 in[str] = 1; 43 d[str] = 0; 44 while(!que.empty()) 45 { 46 u = que.front(); 47 in[u] = 0; 48 que.pop(); 49 for(i = first[u];i != -1;i = edge[i].next) 50 { 51 v = edge[i].v; 52 if(d[v] > d[u]+edge[i].w) 53 { 54 d[v] = d[u]+edge[i].w; 55 if(!in[v]) 56 { 57 in[v] = i; 58 que.push(v); 59 } 60 } 61 } 62 } 63 for(i = 1;i <= p;i ++) 64 { 65 dis[str][i] = d[i]; 66 dis[i][str] = d[i]; 67 } 68 } 69 int main() 70 { 71 int i,j,n,c,ans,sum,sv,ev,w; 72 freopen("butter.in","r",stdin); 73 freopen("butter.out","w",stdout); 74 scanf("%d%d%d",&n,&p,&c); 75 CL(); 76 for(i = 1;i <= p;i ++) 77 { 78 for(j = 1;j <= p;j ++) 79 dis[i][j] = INF; 80 dis[i][i] = 0; 81 } 82 for(i = 1;i <= n;i ++) 83 { 84 scanf("%d",&cow[i]); 85 } 86 for(i = 1;i <= c;i ++) 87 { 88 scanf("%d%d%d",&sv,&ev,&w); 89 add(sv,ev,w); 90 add(ev,sv,w); 91 } 92 for(i = 1;i <= n;i ++) 93 { 94 spfa(cow[i]); 95 } 96 ans = INF; 97 for(i = 1;i <= p;i ++) 98 { 99 sum = 0; 100 for(j = 1;j <= n;j ++) 101 { 102 if(dis[i][cow[j]] == INF) 103 break; 104 sum += dis[i][cow[j]]; 105 } 106 if(j == n+1) 107 { 108 if(ans > sum) 109 ans = sum; 110 } 111 } 112 printf("%d\n",ans); 113 return 0; 114 }