Prim最小生成樹-------電子農業網(Agri-Net)
阿新 • • 發佈:2020-12-22
VJ電子農業網(Agri-Net)
題目
農夫約翰當選為本鎮市長!他的競選承諾之一是將網際網路連線到該地區的所有農場。他當然需要你的幫助。
農民約翰為他的農場訂購了一個高速連線,並將與其他農民分享他的連線。為了將成本降到最低,他想把最小數量的光纖連線到他的農場和所有其他農場。
給出連線每一對農場需要多少纖維的列表,你必須找到將它們連線在一起所需的最小數量的纖維。每個場必須連線到其他場,以便包可以從任何一個場流到任何其他場。
任何兩個農場之間的距離不得超過10萬。
輸入
輸入包括幾個案例。對於每一種情況,第一行包含農場數N(3<=N<=100)。下面的行包含NxN連續矩陣,其中每個元素顯示從農場到另一個單元的距離。從邏輯上講,它們是N個空間分隔整數的N行.在物理上,他們的長度限制在80個字元,所以有些行繼續在其他。當然,對角線將是0,因為從農場I到它本身的距離對這個問題不感興趣。
對於每一種情況,輸出一個整數長度,即連線整個農場所需的最小光纖長度之和
解答:典型的例題直接prim一次即可求出答案。
#include<iostream>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int map[105][105];
int used[105];
int dist[105];
int n;
void init()
{
memset(used,0,sizeof(used));
memset(dist,inf,sizeof(dist));
}
int prim()
{
init ();
int i;
int sum=0;
dist[1]=0;
while(1)
{
int u=-1,v,i,min=inf;
for(i=1;i<=n;i++)
{
if(min>dist[i]&&used[i]==0)
{
min=dist[i];
u=i;
}
}
if(u==-1)
{
break;
}
used[u]=1;
sum+=dist[u];
for(v=1;v<=n;v++)
{
if(map[u][v]!=inf&&dist[ v]>map[u][v]){
dist[v]=map[u][v];
}
}
}
return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j;
int sum=0;
memset(map,0x3f,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
}
sum = prim();
cout<<sum<<endl;
}
return 0;
}