描述
某國有n座城市,需要在這n座城市之間建造有線通信網絡使得任意兩座城市都可以互相通訊,任意兩座城市之間要修建通信線路的費用都是大於0的整數。現在請你幫助設計一個通信網絡,使得總的造價最低。
測試集保證給定的網絡是一個連通圖。
比如有5個城市,共有8條邊,城市編號以及通信線路的造價如下:
(1 2 2),(1 3 12),(2 3 8),(2 5 9),(4 1 10),(4 3 6),(5 3 3),(5 4 7),
最低造價是19
格式
輸入格式
一共有e+1行。第一行兩個正整數,分別是n(城市數,1<≤n≤100)和e(邊數)。
以下e行,每行3個數,分別是:i,j,wij(1≤wij≤100),表示在城市i和j之間修建通信線路的造價。
輸出格式
一個正整數,表示所需的最低造價
樣例
輸入樣例
5 10 1 2 22 1 3 6 1 4 3 1 5 63 2 3 47 2 4 68 2 5 56 3 4 82 3 5 38 4 5 38
輸出樣例
69
限制
時間限制:100 ms
內存限制:16384 KB
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
struct network{
int x;
int y;
int weight;
} net[10005];
int ans=0, n, e;
int father[105];
bool compare(const network n1, const network n2) {
return n1.weight < n2.weight;
}
int findFather(int num) {
while (father[num] != num) {
num = father[num];
}
return num;
}
void kruskal() {
for (int i=0; i<e; i++) {
int a = findFather(net[i].x);
int b = findFather(net[i].y);
if (a != b) {
ans += net[i].weight;
father[a] = b;
}
}
}
int main(){
scanf ("%d %d", &n, &e);
for (int i=0; i<e; i++) {
scanf ("%d %d %d", &net[i].x, &net[i].y, &net[i].weight);
}
for (int i=1; i<=n; i++) {
father[i] = i;
}
sort(net, net+e, compare);
kruskal();
printf ("%d", ans);
return 0;
}