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