HDU - 1232 畅通工程题解
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232
专题链接:https://vjudge.net/contest/351234#problem/H
思路
题意要求出保证每个城镇“通路”的前提下的最小待建路数,我们只要将原本就存在的路尽可能地纳入我们的最终企划中,再用城镇数-1再减去纳入规划中的原有路数即可。
对于重复的路段,我们使用并查集算法即可将其剔除。
AC代码如下
#include<cstdio>
#include<iostream>
using namespace std;
int N,M;
struct note//用于存储路段
{
int a;
int b;
}arr[500001];
int root[1001];用于存储每个节点的父节点
int find(int x)
{
if (x == root[x])
return x;
return find(root[x]);
}
int main()
{
while (cin >> N)
{
if (N == 0)
break;
cin >> M;
for (int i = 1; i <= N; i++)
root[i] = i;
for (int i = 1; i <= M; i++)
scanf("%d%d", &arr[i].a, &arr[i].b);
int sum = 0;//计入纳入规划的路段数
for (int i = 1; i <= M; i++)
{
int x = find(arr[i].a);
int y = find(arr[i].b);
if (x != y)
{
sum++;
root[x] = y;
}
}
printf("%d\n", N - 1 - sum);
}
}