Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 34717 | Accepted: 16846 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
/*#include
#include
#include
using namespace std;
const int N=30010;
int pre[N],son[N];
int find(int x)
{
return x==pre[x]?x:find(pre[x]);
}
void join(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx!=yy)
{
pre[yy]=xx;
son[xx]+=son[yy];
}
}
int main()
{
int n,m,num;
while(~scanf("%d%d",&n,&m)&&n+m)
{
for(int i=0;i
pre[i]=i;
son[i]=1;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&num);
int *s=new int[num];
for(int j=0;j
scanf("%d",&s[j]);
if(j!=0)
join(s[j-1],s[j]);
}
delete s;
}
printf("%d\n",son[find(0)]);
}
return 0;
}*/
/*
#include
#include
#include
using namespace std;
const int maxn=30005;
int father[maxn],son[maxn];
void init(int n)
{
int i;
for(i=0;i
father[i]=i;
son[i]=1;
}
}
int find(int x)
{
int r=x,t;
while(father[r]!=r) r=father[r];
while(x!=r)
{
t=father[x];
father[x]=r;
x=t;
}
return x;
//if(x!=father[x])
// father[x]=find(father[x]);
//return father[x];
}
void unions(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx==yy) return;
if(son[xx]>=son[yy])
{
father[yy]=xx;
son[xx]=son[xx]+son[yy];
}
else
{
father[xx]=yy;
son[yy]=son[yy]+son[xx];
}
}
int main()
{
int n,m,k,first,next;
int i,j;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m)
break;
init(n);
for(i=0;i
cin>>k>>first;
for(j=1;j
cin>>next;
unions(first,next);
}
}
cout<
}*/
/*
#include
#include
#include
using namespace std;
const int maxn=30000+10;
int pa[maxn];//x的父亲节点;
int rank[maxn];//rank'[x]是x的高度的一个上界;
int num[maxn];////集合元素的个数;
void make_set(int x)
{//创建一个单元集;
pa[x]=x;
rank[x]=0;
num[x]=1;
}
int find_set(int x)//带路径压缩的查找;
{//保存待查找的数;
int r=x,t;
//找到根节点;
while(pa[r]!=r)
r=pa[r];
while(x!=r)
{
t=pa[x];
pa[x]=r;
x=t;
}
return x;
//if(x!=pa[x])
//pa[x]=find_set(pa[x]);
// return pa[x];
}
//合并下,x,y所在的集合;
void union_set(int x,int y)
{
int xx=find_set(x);
int yy=find_set(y);
if(xx==yy) return;
if(rank[xx]>rank[yy])//让rank比较高的作为父结点
{
pa[yy]=xx;
num[xx]+=num[yy];
}
else
{
pa[xx]=yy;
//if(rank[xx]==rank[yy])
// rank[yy]++;
num[yy]+=num[xx];
}
}
int main()
{
int n,m,i,j;
while(~scanf("%d %d",&n,&m))
{
if(m==n&&n==0) break;
if(m==0)
{
cout<<"1\n";
continue;
}
for(i=0; i
make_set(i);
}
int t,x;
int y;
for(i=0; i
scanf("%d",&t);
scanf("%d",&x);
for(j=1; j
scanf("%d",&y);
union_set(x,y);
x=y;
}
}
x=find_set(0);/*找到0所在的树的树根*/
/* cout<
return 0;
}*/
#include
#include
#include
using namespace std;
const int maxn=30000+10;
int father[maxn];
int num[maxn];
int rank[maxn];
void set(int x)
{
father[x]=x;
num[x]=1;
rank[x]=0;
}
int find(int x)
{
return x==father[x]?x:find(father[x]);
}
void join(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx==yy) return;
if(rank[xx]>rank[yy])
{
father[yy]=xx;
num[xx]+=num[yy];
}
else
{
father[xx]=yy;
num[yy]+=num[xx];
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=0;i
if(m==0)
{
cout<<"1\n";continue;
}
int t,x,y;
while(m--)
{
cin>>t;
cin>>x;
for(int i=1;i
cin>>y;
join(x,y);
x=y;
}
}
x=find(0);
printf("%d\n",num[x]);
}
}