您的位置:首页 > 其它

USACO/butter 3.2.6

2013-05-13 00:17 447 查看
主要用到spfa

#include<stdio.h>
#include<stdlib.h>
#define max 100000000
int dis[810][810]={0};
int con[810][810]={0};
int visit[1000]={0};
int edge[810]={0};
int num;
int queue[2000],front,rear;
/*====================
初始化
======================*/
void init(int ars[][810])
{
int i ,j;
for(i=0;i<801;i++)
{
for(j=0;j<801;j++)
{
if(i!=j)
{
dis[i][j]=max;
}
}
}
}
/*======================
spfa算法
=======================*/
void spfa(int n,int pasture,int final[])
{
int i ,j,t,k;
for(i=1;i<=pasture;i++)
{
final[i]=max;
}
final
=0;
queue[rear++]=n;
visit
=1;
while(front<rear)
{
k=queue[front++];
for(i=1;i<=edge[k];i++)
{
t=con[k][i];
if(final[t]>final[k]+dis[k][t])
{
final[t]=final[k]+dis[k][t];
if(!visit[t])
{
queue[rear++]=t;
visit[t]=1;
}
}
}

visit[k]=0;
}
}

int main()
{
FILE *fin=fopen("butter.in","r");
FILE *fout=fopen("butter.out","w");
int pasture;
int path;
int cow[600]={0};
int i ,j,x,y,t;
int ans=max;
int sum;
int final[2000];
fscanf(fin,"%d %d %d",&num,&pasture,&path);
init(dis);
for(i=0;i<num;i++)
{
fscanf(fin,"%d",&cow[i]);
}
for(i=0;i<path;i++)
{
fscanf(fin,"%d %d %d",&x,&y,&t);
edge[x]++;con[x][edge[x]]=y;dis[x][y]=t;
edge[y]++;con[y][edge[y]]=x;dis[y][x]=t;
}
for(i=1;i<=pasture;i++)
{
memset(visit,0,sizeof(visit));
front=rear=0;
spfa(i,pasture,final);
sum=0;
for(j=0;j<num;j++)
{
sum+=final[cow[j]];
}
ans=ans<sum?ans:sum;
}
fprintf(fout,"%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spfa