http://acm.pku.edu.cn/JudgeOnline/problem?id=2524
http://acm.pku.edu.cn/JudgeOnline/problem?id=1611
code 2524
- #include<iostream>
- using namespace std;
- int pre[50010],num;
- int find(int a);
- void un(int a,int b);
- int main()
- {
- int n,m;
- int i,a,b,T(1);
- freopen("in.txt","r",stdin);
- while(cin>>n>>m&&n&&m)
- {
- num=n;//初始化是每个人的信仰都不同
- for( i=1; i<=50005; i++)
- pre[i]=0;
- for( i=1; i<=m; i++)
- {
- scanf("%d%d",&a,&b);
- un(a,b);
- }
- cout<<"Case "<<T++<<": "<<num<<endl;
- }
- return 0;
- }
- int find(int a)//路径压缩
- {
- int t=a,z;
- while(pre[t]!=0)t=pre[t];
- while(a!=t)
- {
- z=pre[a];
- pre[a]=t;
- a=z;
- }
- return t;
- }
- void un(int a,int b)
- {
- //int aa,bb;
- int aa,bb;
- aa=find(a);
- bb=find(b);
- if(aa==bb&&aa)//祖先一样的情况
- return;
- if(aa==0)
- pre[bb]=aa;
- else
- pre[aa]=bb;
- num--;
- }
code 1611
- #include<iostream>
- #include <algorithm>
- using namespace std;
- short pre[30001],num[30001];
- void un( int a, int b);
- int find(int a);
- int main()
- {
- int n, i, m,a,j,b,temp;
- freopen("in.txt","r",stdin);
- while(cin>>n>>m&&m||n)
- {
- for( i=0; i<30001; i++)
- pre[i]=i;
- for( i=0; i<m; i++)
- {
- cin>>a;
- for( j=0; j<a; j++)
- {
- cin>>b;
- if(j==0)
- temp=b;
- un(temp,b);
- }
- }
- for( i=0; i<30001; i++)
- find(i);
- sort(pre,pre+30001);
- n=0,j=0;
- while(!pre[n++]) j++;
- cout<<j<<endl;
- }
- return 0;
- }
- int find( int a)//未用路径压缩
- {
- int t;
- t=a;
- while(pre[t]!=t) t=pre[t];
- pre[a]=t;
- return t;
- }
- void un( int a, int b)
- {
- int aa,bb;
- aa=find(a);
- bb=find(b);
- if(aa==0)
- pre[bb]=aa;
- else
- pre[aa]=bb;
- }