通信網建設(最小生成樹)

描述

某國有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

通信網絡規劃的最短路徑(最小生成樹的2種算法介紹)

最小生成樹之城市規劃

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章