Problem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。
Sample Input
3 2
1 2 1
1 3 1
1 0
Sample Output
2
0
代码一为解释
代码二为清晰代码
一、
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 0x3f3f3f3f
using namespace std;
int map[1123][1123];
int vis[1123];
int lowcost[1123];
int flag, sum;
void pri(int n)
{
flag = 0;
sum = 0;
int k = 1;
for(int i = 1; i <= n; i++)
{
lowcost[i] = map[i][1]; // 初始化
}
vis[1] = 1;
for(int i = 2; i <= n; i++)
{
int t = MAX;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && t > lowcost[j]) // 找到点未访问且权值最小的边
{
t = lowcost[j];
k = j; // 记录该点
}
}
if(t == MAX) // 没有符合条件的点即此图不连通
{
//cout << "-1" << endl;
flag = 1;
return ;
}
vis[k] = 1;
sum+=t; // 权值累加
for(int j = 1; j <= n; j++)
{
if(!vis[j] && map[j][k] < lowcost[j]) // 如果此时点未访问且权值小于此时lowcost的值
{
lowcost[j] = map[j][k]; // 更新
}
}
}
}
int main()
{
int n, m, cost;
while(cin >> n >> m)
{
//map初始化为无穷大,不是初始化为0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
{
map[i][j] = 0;
}
else
{
map[i][j] = MAX;
}
}
}
memset(vis, 0, sizeof(vis));
while(m--)
{
int u, v;
cin >> u >> v >> cost;
if(map[u][v] > cost) // 窝草 重边是什么鬼!!!坑死了!!!!QAQ
{
map[u][v] = map[v][u] = cost;
}
}
pri(n);
if(!flag)
{
cout << sum << endl;
}
}
return 0;
}
二、
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int a[1010][1010], b[1010];
int c[1010];
int sum, n, m, flag;
void prime()
{
int k, t, i, j;
b[1] = 1;
for(j = 1; j <= n; j++)
{
c[j] = a[j][1];
}
for(i = 2; i <= n; i++)
{
t = inf;
for( j = 1; j <= n; j++)
{
if(b[j] == 0&&c[j] < t)
{
t = c[j];
k = j;
}
}
if(t == inf)
{
flag = 1;
break;
}
b[k] = 1;
sum +=t;
for(j = 1; j <= n; j++)
{
if(b[j] == 0 && c[j] > a[j][k])
{
c[j] = a[j][k];
}
}
}
}
int main()
{
int u, v, i, cost, j;
while(cin >> n >> m)
{
memset(a, inf, sizeof(a));
memset(b, 0, sizeof(b));
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(i == j)
{
a[i][j] = 0;
}
}
}
flag = 0;
sum = 0;
for(i = 1; i <= m; i++)
{
cin >> u >> v >> cost;
if(cost < a[u][v])
{
a[u][v] = a[v][u] = cost;
}
}
prime();
if(m < n-1)
{
printf("0\n");
}
if(flag==0)
{
printf("%d\n", sum);
}
}
return 0;
}