标签:
Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7755 Accepted Submission(s): 2449
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 using namespace std; 9 const int INF=0x3f3f3f3f; 10 const int MAXN=1e6+10; 11 int pre[MAXN],prt[MAXN],num[MAXN]; 12 int find(int x){ 13 int r=x; 14 while(r!=pre[r])r=pre[r]; 15 pre[x]=r; 16 return r; 17 } 18 void merge(int x,int y){ 19 int f1,f2; 20 f1=find(x);f2=find(y); 21 if(f1!=f2){ 22 pre[f2]=f1; 23 } 24 } 25 int n; 26 void initial(){ 27 for(int i=0;i<=n;i++)pre[i]=i,prt[i]=i; 28 memset(num,0,sizeof(num)); 29 } 30 int main(){ 31 int m; 32 char s[5]; 33 int a,b,flot=0; 34 while(~scanf("%d%d",&n,&m),n|m){ 35 initial(); 36 int k=n; 37 while(m--){ 38 scanf("%s",s); 39 if(s[0]==‘M‘){ 40 scanf("%d%d",&a,&b); 41 merge(prt[a],prt[b]); 42 } 43 else{ 44 scanf("%d",&a); 45 prt[a]=k; 46 pre[k]=k; 47 k++; 48 } 49 } 50 int cnt=0; 51 for(int i=0;i<n;i++){ 52 int t=find(prt[i]); 53 if(!num[t]){ 54 cnt++; 55 num[t]=1; 56 } 57 } 58 printf("Case #%d: %d\n",++flot,cnt); 59 } 60 return 0; 61 }
乱世天下,诸侯割据。每个诸侯王都有一片自己的领土。但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土 面积不断扩大。而实力弱的诸侯王为了不让自己的领土被吞并,他会联合一些其他同样弱小的诸侯国,组成联盟(联盟不止一个),来共同抵抗那些强大的诸侯国。 强大的诸侯国为了瓦解这些联盟,派出了最优秀的间谍来离间他们,使一些诸侯国退出联盟。最开始,每个诸侯国是一个联盟。
有两种操作
1、U x y 表示x和y在同一个联盟。(0≤x,y<n)
2、D x 表示x退出联盟。
5 7
U 0 1
U 1 2
U 0 3
D 0
U 1 4
D 2
U 0 2
10 1
U 0 9
Case #1: 2
Case #2: 9
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4902582.html