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 }

你可能感兴趣的:(USACO)