您的位置:首页 > 其它

hihoCoder#1098 最小生成树二·Kruscal算法

2015-04-06 21:10 155 查看
原题地址

以前没写过Kruscal算法,写了才知道原来比Prime算法简单多了。。。

并查集的应用太经典了!

代码:

#include <iostream>
#include <cstdlib>

using namespace std;

#define MAX_EDGE 1000008
#define MAX_POINT 100008

struct Edge {
int a;
int b;
int len;
};

int mycmp(const void *a, const void *b) {
Edge *pa = (Edge *) a;
Edge *pb = (Edge *) b;
return pa->len - pb->len;
}

int N, M;
Edge e[MAX_EDGE];
int p[MAX_POINT];

int find(int i) {
if (p[i] == i)
return i;
return p[i] = find(p[i]);
}

void merge(int i, int j) {
int pi = find(i);
int pj = find(j);
p[pi] = pj;
}

int kruscal() {
int res = 0;

qsort(e, M, sizeof(Edge), mycmp);
for (int i = 0; i < M; i++) {
if (find(e[i].a) == find(e[i].b))
continue;
res += e[i].len;
merge(e[i].a, e[i].b);
}

return res;
}

int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++)
p[i] = i;
for (int i = 0; i < M; i++)
scanf("%d%d%d", &(e[i].a), &(e[i].b), &(e[i].len));

printf("%d\n", kruscal());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: