0
点赞
收藏
分享

微信扫一扫

HDU 1879 继续畅通工程——最小生成树


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn = 110;

int par[maxn], ran[maxn];

void init(int n) {
for (int i = 0; i <= n; i++) {
par[i] = i, ran[i] = 0;
}
}

int seek(int x) {
if (par[x] == x) return x;
else return par[x] = seek(par[x]);
}

void unite(int x, int y) {
x = seek(x), y = seek(y);
if (x == y) return;
if (ran[x] == ran[y]) par[x] = y;
else {
par[y] = x;
if (ran[x] == ran[y]) ran[x]++;
}
}

struct Edge {
int u, v;
double cost;
bool operator < (const Edge &another) const {
return cost < another.cost;
}
}edge[maxn*maxn];

int main()
{
int n, u, v, cost, flag;
while (scanf("%d", &n) == 1 && n) {
int len = n * (n - 1) / 2;
int edge_cnt = 0, cnt = 0;
init(n);
for (int i = 1; i <= len; i++) {
scanf("%d %d %d %d", &u, &v, &cost, &flag);
if (flag == 1) {
if (seek(u) != seek(v)) {
cnt++;
unite(u, v);
}
}
else if (flag == 0) {
edge_cnt++;
edge[edge_cnt].u = u, edge[edge_cnt].v = v, edge[edge_cnt].cost = cost;
}
}
sort(edge + 1, edge + 1 + edge_cnt);
int ans = 0;
for (int i = 1; i <= edge_cnt; i++) {
if (cnt == n - 1) break;
if (seek(edge[i].u) != seek(edge[i].v)) {
cnt++;
ans += edge[i].cost;
unite(edge[i].u, edge[i].v);
}
}
printf("%d\n", ans);
}
return 0;
}


举报

相关推荐

0 条评论