第一题
1.题目描述:
该题的目的是要你统计图的连通分支数。
输入描述:
每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。
输出描述:
输出每个图的联通分支数。
示例1
输入
1 4
4 3
5 5
输出
2
2.基本思路
同样采用并查集的思路来统计图中连通分量的个数,但该题与之前的畅通工程 OJ 1012有所区别,该题中的顶点数即为输入的顶点个数,不多也不少。而畅通工程中的顶点个数就是给定的N,即1~N之间的顶点均存在,所以在该题中我们需要采用数据结构set来存储所有的元素(每个元素仅存一次)。
3.代码实现
#include <iostream>
#include <set>
#define N 1000000
using namespace std;
int Tree[N];
int findRoot(int x){
if(Tree[x]==-1)
return x;
else{
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
set<int> S;
int main()
{
int a,b;
for(int i=0;i<N;i++){
Tree[i]=-1;
}
while(~scanf("%d%d",&a,&b)){
S.insert(a);
S.insert(b);
int rootA = findRoot(a);
int rootB = findRoot(b);
if(rootA!=rootB){
Tree[rootA]=rootB;
}
}
int ans=0;
for(auto it=S.begin();it!=S.end();it++){
if(Tree[*it]==-1)ans++;
}
printf("%d\n",ans);
return 0;
}
/*
4 3
1 2
2 3
3 2
3 2
1 2
2 3
*/