USACO/butter 3.2.6

主要用到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[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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值