lkmdeer 提交的代码
提交时间:2022年6月26日 23:54 语言:C++运行时间:0ms占用内存:140K
运行状态: Accepted
题目:继续畅通工程1311

大会员可查看代码,点此开通大会员

                
                    /*最小生成树 kruskal 
已经存在的就要提前merge 
*/
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 110;
const int MAXM = 5500;
struct Edge{
	int u, v;
	int cost;
}E[MAXN];
int n, m;
int father[MAXN];
int ans = 0; int eNum = 0;
bool cmp(Edge a, Edge b) {
	return a.cost < b.cost;
} 

int find(int x) {
	int a = x;
	while(x != father[x]) {
		x = father[x];
	}
	while(a != father[a]) {
		int z = a;
		a = father[a];
		father[z] = x;
	}
	return x;
}

int kruskal(int n, int m) {

	for(int i = 1; i <= n; i++) {
		father[i] = i;
	}
	
	sort(E, E + m, cmp);
	for(int i = 0; i < m; i++) {
		int faU = find(E[i].u);
		int faV = find(E[i].v);
		if(faU != faV) {
			father[faU] = faV;
			ans += E[i].cost;
			eNum++;
			if(eNum == n - 1) break; 
		}
	}
	if(eNum != n - 1) return -1;
	else return ans;
}

int main() {
	int t;
	int u, v, state, cost;
	while(true) {
		scanf("%d", &t);
		if(t == 0) break;
		else {
			ans = 0, eNum = 0;
			for(int i = 0; i < t * (t - 1) / 2; i++) {
				scanf("%d%d%d%d", &u, &v, &cost, &state);
				E[i].u = u, E[i].v = v, E[i].cost = cost;
				if(state == 1) {
//					int faU = find(E[i].u);
//					int faV = find(E[i].v);
//					if(faU != faV) {
//						father[faU] = faV;
//						//ans += E[i].cost;
//						eNum++;
//						//if(eNum == n - 1) break; 
					
					//}
					E[i].cost = 0;
				} 
			}
			printf("%d\n", kruskal(t, t * (t - 1) / 2));
		}
	}
	return 0;
}