HDU 1232(并查集)
有道路联通的可以看作一个区域,给出一些道路的联通关系,求出有多少区域不连通;
好吧,我承认我照着模板都敲错了...(打死)!!
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n;
int parent[1111];
void set()//初始化
{
for(int i=1;i<=n;i++)
parent[i]=-1;
}
int find(int x)//查找x的根节点
{
int s;
for(s=x;parent[s]>=0;s=parent[s])
;
while(s!=x)
{
int tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}
void u(int R1,int R2)//将两个元素合并
{
int r1=find(R1);
int r2=find(R2);
int tmp=parent[r1]+parent[r2];
if(r1>r2)
{
parent[r1]=r2;
parent[r2]=tmp;
}
else
{
parent[r2]=r1;
parent[r1]=tmp;
}
}
int main()
{
int i,j,k,l,m;
while(cin>>n&&n!=0)
{
set();
cin>>m;
for(i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
if(find(a)!=find(b))
u(a,b);
}
int sum=0;
for(i=1;i<=n;i++)
if(parent[i]<0)
sum++;
cout<<sum-1<<endl;
}
return 0;
}
有道路联通的可以看作一个区域,给出一些道路的联通关系,求出有多少区域不连通;
好吧,我承认我照着模板都敲错了...(打死)!!
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n;
int parent[1111];
void set()//初始化
{
for(int i=1;i<=n;i++)
parent[i]=-1;
}
int find(int x)//查找x的根节点
{
int s;
for(s=x;parent[s]>=0;s=parent[s])
;
while(s!=x)
{
int tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}
void u(int R1,int R2)//将两个元素合并
{
int r1=find(R1);
int r2=find(R2);
int tmp=parent[r1]+parent[r2];
if(r1>r2)
{
parent[r1]=r2;
parent[r2]=tmp;
}
else
{
parent[r2]=r1;
parent[r1]=tmp;
}
}
int main()
{
int i,j,k,l,m;
while(cin>>n&&n!=0)
{
set();
cin>>m;
for(i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
if(find(a)!=find(b))
u(a,b);
}
int sum=0;
for(i=1;i<=n;i++)
if(parent[i]<0)
sum++;
cout<<sum-1<<endl;
}
return 0;
}