您的位置:首页 > 其它

HDU 1233(最小生成树,并查集)

2014-01-15 21:08 309 查看
这里使用kruskal:

 

#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;

struct edge
{
int u, v, w;
edge() {}
edge(int _u, int _v, int _w) : u(_u), v(_v), w(_w) {}
bool operator <(const edge& rhs) const
{
return w > rhs.w;
}
};

int set[101];

int find(int x)
{
return set[x] < 0 ? x : set[x] = find(set[x]);
}

int main()
{
int n, i, u, v, w, ans;
while (scanf("%d", &n) != EOF && n)
{
priority_queue<edge> q;
memset(set, -1, sizeof set);
ans = 0;
for (i = 1; i <= n*(n-1)/2; ++i)
{
scanf("%d %d %d", &u, &v, &w);
q.push(edge(u, v, w));
}
while (!q.empty())
{
edge p = q.top(); q.pop();
u = find(p.u), v = find(p.v);
if (u != v)
{
set[u] += set[v];
set[v] = u;
ans += p.w;
if (set[u] == -n) break;
}
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息