hdoj 1233 还是畅通工程(最小生成树)

时间:2023-03-08 20:41:03
hdoj 1233 还是畅通工程(最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233

思路分析:该问题为最小生成树问题,使用kruskal算法或者prim算法即可解决;

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int MAX_N = + ;
int u[MAX_N], v[MAX_N], w[MAX_N];
int p[MAX_N], r[MAX_N]; inline int cmp(const int i, const int j) { return w[i] < w[j]; }
int Find(int a)
{
if (p[a] == a)
return a;
else
return p[a] = Find(p[a]);
} int Union(int a, int b)
{
int p_a = Find(a);
int p_b = Find(b); if (p_a == p_b)
return -;
if (p_a > p_b)
p[p_b] = p_a;
else
p[p_a] = p_b;
return ;
} inline int Kruskal(int road_num)
{
int ans = ; for (int i = ; i <= road_num; ++i)
p[i] = i;
for (int i = ; i < road_num; ++i)
r[i] = i;
sort(r, r + road_num, cmp);
for (int i = ; i < road_num; ++i)
{
int e = r[i];
int x = Find(u[e]);
int y = Find(v[e]);
if (x != y)
{
ans += w[e];
Union(x, y);
}
}
return ans;
} int main()
{
int ver_num;
int ver_1, ver_2, len; while (scanf("%d", &ver_num) != EOF && ver_num)
{
int road_num = ver_num * (ver_num - ) / ;
for (int i = ; i < road_num; ++i)
{
scanf("%d %d %d", &ver_1, &ver_2, &len);
u[i] = ver_1;
v[i] = ver_2;
w[i] = len;
}
int ans = Kruskal(road_num);
printf("%d\n", ans);
}
return ;
}