浙江大学机试 还是畅通工程 Easy *最小生成树问题

基本思想:

最简单的prim即可解决;

关键点;

无;

#include<iostream>
#include<vector>
#include<string>
using namespace std;

const int maxn = 1010;
const int INF = 10000000;

bool vis[maxn];
int dis[maxn];
int ma[maxn][maxn];
int n;

void init() {
	fill(ma[0], ma[0] + maxn * maxn, INF);
	fill(vis, vis + maxn, false);
	fill(dis, dis + maxn, INF);
}

int prim() {
	int ans = 0;
	dis[1] = 0;
	for (int u = 0; u < n; u++) {
		int index = -1;
		int Min = INF;
		for (int i = 1; i <= n; i++) {
			if (!vis[i] && Min > dis[i]) {
				index = i;
				Min = dis[i];
			}
		}
		if (index == -1)
			return -1;
		vis[index] = true;
		ans += dis[index];
		for (int i = 1; i <= n; i++) {
			if (!vis[i] && ma[index][i] != INF && dis[i] > ma[index][i]) {
				dis[i] = ma[index][i];
			}
		}
	}
	return ans;
}

int main() {
	while (cin >> n) {
		int a, b, d;
		init();
		if (n == 0)
			break;
		for (int i = 0; i < n*(n - 1)/2; i++) {
			cin >> a >> b >> d;
			ma[a][b] = ma[b][a] = d;
		}
		cout << prim() << endl;
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/songlinxuan/p/12597961.html