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 }
posted @ 2012-11-22 18:24  Naix_x  阅读(166)  评论(0编辑  收藏  举报