题目描述 有一些电脑,一部分电脑有双向数据线连接。如果一个电脑得到数据,它可以传送到的电脑都可以得到数据。现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据。
输入格式 第一行两个数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; }