[spfa]SSL 1693 香甜的黃油

傳送門

Description

  農夫John發現做出全威斯康辛州最甜的黃油的方法:糖。把糖放在一片牧場上,他知道N(1<=N<=500)只奶牛會過來舔它,這樣就能做出能賣好價錢的超甜黃油。當然,他將付出額外的費用在奶牛上。
  農夫John很狡猾。像以前的Pavlov,他知道他可以訓練這些奶牛,讓它們在聽到鈴聲時去一個特定的牧場。他打算將糖放在那裏然後下午發出鈴聲,以至他可以在晚上擠奶。
  農夫John知道每隻奶牛都在各自喜歡的牧場(一個牧場不一定只有一頭牛)。給出各頭牛在的牧場和牧場間的路線,找出使所有牛到達的路程和最短的牧場(他將把糖放在那)

題解

這題其實folyd就可以跑過
路徑都是**雙向邊!!** 
所以我們可以處理完一邊,再將另一邊直接賦值即可

代碼

#include<cstdio>
#include<iostream>
using namespace std;
const int inf=99999999;
int n,p,c,num[801],d[801][801],ans,u,v,x,sum;
int main()
{
    scanf("%d%d%d",&n,&p,&c);
    for (int i=1;i<=p;i++)
        for (int j=1;j<=p;j++)
            if (i==j) d[i][j]=0;
            else d[i][j]=inf;
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        num[x]++;
    }
    for (int i=1;i<=c;i++)
    {
        scanf("%d%d%d",&u,&v,&x);
        d[u][v]=x; d[v][u]=x;
    }
    for (int k=1;k<=p;k++)
        for (int i=1;i<=p;i++)  
            for (int j=1;j<i;j++)
                if (d[i][j]>d[i][k]+d[k][j])
                {
                    d[i][j]=d[i][k]+d[k][j];
                    d[j][i]=d[i][j];
                }
    ans=inf;
    for (int i=1;i<=p;i++)
    {
        int sum=0;
        for (int j=1;j<=p;j++) sum+=d[i][j]*num[j];
        if (ans>sum) ans=sum;
    }
    printf("%d",ans);
    return 0;
}
發佈了263 篇原創文章 · 獲贊 423 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章