天天看點

【SSL1682】USACO 3.1 Agri-Net 最短網絡【最小生成樹】

Description

農民約翰被選為他們鎮的鎮長!他其中一個競選承諾就是在鎮上建立起網際網路,并連接配接到所有的農場。當然,他需要你的幫助。約翰已經給他的農場安排了一條高速的網絡線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連接配接所有的農場。你将得到一份各農場之間連接配接費用的清單,你必須找出能連接配接所有農場并所用光纖最短的方案。每兩個農場間的距離不會超過100000

Input

第一行: 農場的個數,N(3<=N<=100)。

後來的行包含了一個N*N的矩陣,表示每個農場之間的距離。理論上,他們是N行,每行由N個用空格分隔的數組成,實際上,他們限制在80個字元,是以,某些行會緊接着另一些行。當然,對角線将會是0,因為不會有線路從第i個農場到它本身。

Output

隻有一個輸出,其中包含連接配接到每個農場的光纖的最小長度。

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
           

Sample Output

28
           

分析

這也是道模闆題,跟最優布線問題是一樣的。

話不多,上代碼

#include<iostream>
#include<cstdio>
using namespace std;
int minn[101],g[101][101],n,ans;
int u[1001]={0};
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>g[i][j];
		}
	}
	memset(minn,0x7f,sizeof(minn));
	minn[1]=0;
	for(int i=1;i<=n;i++)
	{
		int k=0;
		for(int j=1;j<=n;j++)
		{
			if(u[j]==0&&(minn[j]<minn[k]))
			{
				k=j;
			}
		}
		u[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(u[j]==0&&(g[k][j]<minn[j]))
			{
				minn[j]=g[k][j];
			}
		} 
	}
	for(int i=1;i<=n;i++)
	{
		ans+=minn[i];
	}
	cout<<ans;
	return 0;
} 
           

繼續閱讀