您的位置:首页 > 其它

题解:[USACO 3.2] 香甜的黄油

2014-03-07 09:32 417 查看
/*

没啥好说的,就是相当赤多源的裸最短路

这里采用多次spfa+链表求多源

链接http://218.28.19.228/cogs/problem/problem.php?pid=309

*/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAXN 810

#define INF 999999999

struct EdgeNode{

int adjvex;

int cost;

EdgeNode *next;

};

struct VexNode{

//int data;

EdgeNode *firstedge;

}g[MAXN];

int d[MAXN][MAXN];

void spfa(const int& s)

{

int rear,front,p[MAXN]={0},q[MAXN*5],j;

EdgeNode *k;

q[rear=front=1]=s;

p[s]=1;

d[s][s]=0;

while (front<=rear)

{

j=q[front];

p[j]=0;

for (k=g[j].firstedge;k;k=k->next)

if (d[s][k->adjvex]>d[s][j]+k->cost)

{

d[s][k->adjvex]=d[s][j]+k->cost;

if (!p[k->adjvex])

{

p[k->adjvex]=1;

q[++rear]=k->adjvex;

}

}

++front;

}

}

int main()

{

int i,j,n,p,c,u,v,w,cow[MAXN];

EdgeNode *s;

freopen("butter.in","r",stdin);

freopen("butter.out","w",stdout);

scanf("%d%d%d",&n,&p,&c);

for (i=0;i<n;++i)

scanf("%d",&cow[i]);

for (i=0;i<c;++i)

{

scanf("%d%d%d",&u,&v,&w);

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=v;

s->cost=w;

s->next=g[u].firstedge;

g[u].firstedge=s;

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=u;

s->cost=w;

s->next=g[v].firstedge;

g[v].firstedge=s;

}

/*for (i=1;i<=p;++i)

for (j=1;j<=p;++j)

d[i][j]=INF;*/

memset(d,1,sizeof(d));

int cnt,min=INF;

for (i=1;i<=p;++i)

{

spfa(i);

cnt=0;

for (j=0;j<n;++j)

{

cnt+=d[i][cow[j]];

if (cnt>min) break;

}

if (cnt<min) {

min=cnt;

}

}

printf("%d\n",min);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: