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