1. 程式人生 > 其它 >Prim最小生成樹-------電子農業網(Agri-Net)

Prim最小生成樹-------電子農業網(Agri-Net)

技術標籤:演算法圖論

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