南沙C++信奧賽陳老師解一本通題 1345:【例4-6】香甜的黃油

南沙区信奥赛陈老师發表於2024-10-31

【題目描述】

農夫John發現做出全威斯康辛州最甜的黃油的方法:糖。把糖放在一片牧場上,他知道N(1≤N≤500)只奶牛會過來舔它,這樣就能做出能賣好價錢的超甜黃油。當然,他將付出額外的費用在奶牛上。

農夫John很狡猾。像以前的巴甫洛夫,他知道他可以訓練這些奶牛,讓它們在聽到鈴聲時去一個特定的牧場。他打算將糖放在那裡然後下午發出鈴聲,以至他可以在晚上擠奶。

農夫John知道每隻奶牛都在各自喜歡的牧場(一個牧場不一定只有一頭牛)。給出各頭牛在的牧場和牧場間的路線,找出使所有牛到達的路程和最短的牧場(他將把糖放在那)。

【輸入】

第一行: 三個數:奶牛數N,牧場數P(2≤P≤800),牧場間道路數C(1≤C≤1450)。

第二行到第N+1行: 1到N頭奶牛所在的牧場號。

第N+2行到第N+C+1行:每行有三個數:相連的牧場A、B,兩牧場間距(1≤D≤255),當然,連線是雙向的。

【輸出】

一行 輸出奶牛必須行走的最小的距離和。

【輸入樣例】

3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5

【輸出樣例】

8
#include <bits/stdc++.h>
using namespace std;
int g[1001][1001];
int d[1001][1001];
int a[1001];	//代表每個牧場有的奶牛數量 
#define INF 0x3f3f3f3f
void Floyd(int n)
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(d[i][j]>d[i][k]+d[k][j])
					d[i][j]=d[i][k]+d[k][j];
}
int main()
{
	int n,p,c,ans=INF,cow;
	cin>>n>>p>>c;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	memset(g,INF,sizeof(g));
	memset(d,INF,sizeof(d));
	for(int i=1;i<=c;i++)
	{
		int x,y,w;
		cin>>x>>y>>w;
		g[x][y]=g[y][x]=w;
		d[x][y]=d[y][x]=w;
	}
	Floyd(p);
	for(int i=1;i<=p;i++)		//假設放在任何牧場編號i 
	{
		int total=0;
		for(int j=1;j<=n;j++)
			if(a[j]!=0 &&i!=a[j] ) 	//代表有路徑  自己不需要路徑  可以有多頭牛,這裡要多次運算 
				total+=d[ a[j] ][i];
		ans=min(ans,total);
	}
	cout<<ans;
	return 0;
}
南沙C++信奧賽陳老師解一本通題 1345:【例4-6】香甜的黃油

相關文章