标签:des blog io os sp java for 数据 div
2 1 1 2 2 0
1 2
/*
将森林转化成二叉树具体方法:
① 将森林中的每棵树变为二叉树
② 因为转换所得的二叉树的根结点的右子树均为空,故可将
各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
*/
//由上面很容易看出但凡是将森林分成树然后讲每棵树转化成二叉树其根节点等于其本身。
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int bin[1002];
int find(int x)
{
int r=x;
while(bin[r]!=r)
{
r=bin[r];
}
return r;
}
void merge(int x, int y)
{
int xx=x;
int yy=y;
xx=find(xx);
yy=find(yy);
if(xx!=yy)
{
bin[xx]=yy;
}
}
int main()
{
int n,m;
int i, j;
int x, y;
int cnt;
while(cin>>n>>m)
{
cnt=0;
for(i=0; i<=n; i++)
{
bin[i]=i;
}
for(i=0; i<m; i++)
{
cin>>x>>y;
merge(x, y);
}
for(i=1; i<=n; i++)
{
if(bin[i]==i) //一开始先对每个二叉树的每个节点标号 然后并查集连接成树,
//最后遍历节点依然等于自己本身的就是一棵独立二叉树
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
标签:des blog io os sp java for 数据 div
原文地址:http://www.cnblogs.com/yspworld/p/4120786.html