题目描述
有一些电脑,一部分电脑有双向数据线连接。如果一个电脑得到数据,它可以传送到的电脑都可以得到数据。现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据。
输入格式
第一行两个数n,m。n是点数,m是边数。
接下来m行,每行2个整数p,q表示p到q有一条双向数据线。
输出格式
一个整数,表示至少输入的电脑数量。
输入输出样例
输入 #1
4 5
1 2
1 3
2 3
2 1
3 4
输出 #1
1
说明/提示
对于30%的数据:n<=100,m<=1000
对于60%的数据:n<=2000,m<=100000
对于100%的数据:n<=100000, m<=200000
数据不保证没有重边,不保证没有自回环
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdio>
#include<math.h>
#include<climits>
#include <map>
using namespace std;
int n,m,t1,t2,t3,ans;
int a[100010],b[100010];
int find(int x) {
if(a[x] == x) {
return x;
} else {
return a[x] = find(a[x]);
}
}
int main() {
scanf("%d %d", &n, &m);
ans = 0;
for(int i = 1; i <= n; i++) {
a[i] = i;
}
for(int i = 1; i <= m; i++) {
scanf("%d %d", &t1,&t2);
a[find(t1)] = find(t2);
}
for(int i = 1; i <= n; i++) {
t3 = find(i);
if(b[t3] == 0) {
ans++;
b[t3] = 1;
}
}
cout << ans << endl;
return 0;
}
本文探讨了在一个由电脑和双向数据线构成的网络中,如何确定最少的电脑数量,以便当这些电脑接收到数据时,能确保网络中的所有电脑都能获取到数据。通过并查集算法,我们能够有效地解决这一问题,找到网络中独立的连通组件数量,即为所需最少的数据传播源点。

被折叠的 条评论
为什么被折叠?



