Problem Description
當前農村公路建設正如火如荼的展開,某鄉鎮政府決定實現村村通公路,工程師現有各個村落之間的原始道路統計數據表,表中列出了各村之間可以建設公路的若干條道路的成本,你的任務是根據給出的數據表,求使得每個村都有公路連通所需要的最低成本。
Input
連續多組數據輸入,每組數據包括村落數目N(N <= 1000)和可供選擇的道路數目M(M <= 3000),隨後M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個村莊的編號和修建該道路的預算成本,村莊從1~N編號。
Output
輸出使每個村莊都有公路連通所需要的最低成本,如果輸入數據不能使所有村莊暢通,則輸出-1,表示有些村莊之間沒有路連通。
Example Input
5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6
Example Output
19
題意:
能夠使所有的村莊連接所需的最低成本,當有不連通的路徑時,輸出-1,全部連通輸出最低的成本(最小生成樹問題)。
分析:
所以只要判斷連接的村莊數是否爲n 即可,當兩個村莊之間沒有路徑時,兩村莊間的距離是無窮大,根據這個條件就可以找到能夠連通的村莊數。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int e[1005][1005],book[1005],dis[1005];
int main()
{
int n,m;
int i,j,k;
int tx,ty,tw;
int inf = 99999999,sum,count;
while(scanf("%d%d",&n,&m)!=EOF)
{
count = 0;
sum =0;
memset(book,0,sizeof(book));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i == j)
e[i][j] = 0;
else
e[i][j] = inf;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&tx,&ty,&tw);
e[tx][ty] = e[ty][tx] = tw;
}
for(i=1;i<=n;i++)
dis[i] = e[1][i];
book[1] = 1;
count ++ ;
while(count < n)
{
int minx = inf;
for(i=1;i<=n;i++)
{
if(book[i] == 0 && dis[i] < minx)
{
minx = dis[i];
j = i;
}
}
book[j] = 1;
if(minx == inf) //兩個村莊間沒有路
break;
count++; //count一定放在後面,如果現在已經沒有路了,count=n-1那麼放在前面之後count就是5了,說明所有的都連接了,但事實並不是。
for(k=1;k<=n;k++)
{
if(book[k] == 0 && dis[k] > e[j][k])
dis[k] = e[j][k];
}
sum = sum + dis[j];
}
//都連通輸出成本
if(count == n)
printf("%d\n",sum);
else
printf("-1\n");
}
return 0;
}