您的位置:首页 > 其它

hdu 1879 继续畅通工程(图论:最小生成树)

2014-07-21 14:59 169 查看
简单的最小生成树

但是题目中有个要处理的小细节

对于已经修通的路,我们令它成本为0,在用Kruskal就很好些了

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
using namespace std;

int r[MAXN], p[MAXN], w[MAXN], u[MAXN], v[MAXN];
int n, cnt;

int find(int x) {
return x==p[x] ? x : p[x] = find(p[x]);
}

int cmp(int i, int j) {
return w[i]<w[j];
}

LL Kruskal() {
LL ans = 0;
int i, x, y, e;
for(i=1; i<=n; ++i)
p[i] = i;
for(i=0; i<cnt; ++i)
r[i] = i;
sort(r, r+cnt, cmp);
for(i=0; i<cnt; ++i) {
e = r[i];
x = find(u[e]);
y = find(v[e]);
if(x != y) {
p[x] = y;
ans += w[e];
}
}
return ans;
}

int main(void) {
int m, x, y, dis, fag;
while(scanf("%d", &n) && n) {
m = n*(n-1)/2;
cnt = 0;
while(m--) {
scanf("%d%d%d%d", &x, &y, &dis, &fag);
if(fag)
dis = 0;
u[cnt] = x;
v[cnt] = y;
w[cnt] = dis;
cnt++;
}
cout << Kruskal() << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: