描述

最近,小Hi很喜歡玩的一款遊戲模擬城市開放出了新Mod,在這個Mod中,玩家可以擁有不止一個城市了!

但是,問題也接踵而來——小Hi現在手上擁有N座城市,且已知這N座城市中任意兩座城市之間建造道路所需要的費用,小Hi希望知道,最少花費多少就可以使得任意兩座城市都可以通過所建造的道路互相到達(假設有A、B、C三座城市,只需要在AB之間和BC之間建造道路,那麼AC之間也是可以通過這兩條道路連通的)。

輸入

每個測試點(輸入檔案)有且僅有一組測試資料。

在一組測試資料中:

第1行為1個整數N,表示小Hi擁有的城市數量。

接下來的N行,為一個N*N的矩陣A,描述任意兩座城市之間建造道路所需要的費用,其中第i行第j個數為Aij,表示第i座城市和第j座城市之間建造道路所需要的費用。

對於100%的資料,滿足N<=10^3,對於任意i,滿足Aii=0,對於任意i, j滿足Aij=Aji, 0&ltAij&lt10^4.

輸出

對於每組測試資料,輸出1個整數Ans,表示為了使任意兩座城市都可以通過所建造的道路互相到達至少需要的建造費用。

Sample Input

5
0 1005 6963 392 1182
1005 0 1599 4213 1451
6963 1599 0 9780 2789
392 4213 9780 0 5236
1182 1451 2789 5236 0

Sample Output

4178
題意描述:
輸入城市的個數及N*N的矩陣
計算並輸出使任意兩座城市都可以通過所建造的道路互相到達至少需要的建造費用
解題思路:
典型的求最小生成樹,根據資料的格式,使用Prim演算法即可。Prim演算法主要的思路就是每次選擇距離生成樹最近的結點新增,再更新新結點到尚未加入到樹的各個結點的距離,便於下次查詢距離生成樹最近的結點。
程式碼實現:
 #include<stdio.h>
#include<string.h>
int e[][],book[],dis[];
const int inf=;
int main()
{
int n,i,j,k,c,sum,min;
while(scanf("%d",&n) != EOF)
{
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&e[i][j]);
for(i=;i<=n;i++)
dis[i]=e[][i]; memset(book,,sizeof(book));
book[]=;
c=;
sum=;
while(c < n)
{
min=inf;
for(j=,i=;i<=n;i++)
{
if(!book[i] && dis[i] < min)//注意是且的關係
{
min=dis[i];
j=i;
}
}
book[j]=;
c++;
sum += dis[j];
for(k=;k<=n;k++)
{
if(!book[k] && dis[k] > e[j][k])
dis[k]=e[j][k];
}
}
printf("%d\n",sum);
}
return ;
}

易錯分析:

1、注意在尋找距離生成樹最近的結點時,判斷條件是且