USACO/butter 3.2.6

来源:互联网 发布:网络传输速度测试工具 编辑:程序博客网 时间:2024/04/30 00:15

主要用到spfa

#include<stdio.h>#include<stdlib.h>#define max 100000000int 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[n]=0;    queue[rear++]=n;    visit[n]=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;}


原创粉丝点击