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;
}