题目描述
该题的目的是要你统计图的连通分支数。
输入描述:
每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。
输出描述:
输出每个图的联通分支数。
输入
1 4 4 3 5 5
输出
2
C++实现:
#include<iostream>
#include<string.h>
using namespace std;
int Tree[1000000];
bool flag[1000000];
int findRoot(int x){
if(Tree[x]==-1)return x;
else{
int t=findRoot(Tree[x]);
Tree[x]=t;
return t;
}
}
int main(){
int m,n,Max=0;
//memset(Tree,-1,sizeof(Tree));
for(int i=0;i<1000000;i++){
Tree[i]=-1;
flag[i]=false;
}
while(scanf("%d %d",&m,&n)!=EOF){
if(Max<m)
Max=m;
if(Max<n)
Max=n;
int a=findRoot(m);
int b=findRoot(n);
if(a!=b){
//注意此处是合并操作,即将找到的根置为统一
Tree[a]=b;
//注意此处需要标记
flag[a]=true;
flag[b]=true;
}
}
int num=0;
for(int i=1;i<=Max;i++){
if(Tree[i]==-1&&flag[i]==true)
num++;
}
cout<<num<<endl;
}