做题地址:https://www.luogu.com.cn/problem/P1536
这一题也是在考察并查集,不过这一次不是考察两个顶点是否处于同一块,而是询问区间块的个数。
找到区间块的个数后,再减去一就好了。因为n个点最少由n-1
个边连接起来。
下面是代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
int n, m;
int f[N];
int find(int x){
if (x != f[x]) f[x] = find(f[x]);
return f[x];
}
int main(){
while (cin >> n >> m, n){
for (int i = 1; i <= n; i ++ ) f[i] = i;
while (m -- ){
int a, b; cin >> a >> b;
int x = find(a), y = find(b);
f[x] = y;
}
int res = 0;
for (int i = 1; i <= n; i ++ ){
if (f[i] == i) res ++;
}
cout << res - 1 << endl;
}
return 0;
}