fzu 2155 盟国

Problem 2155 盟国

Accept: 39    Submit: 129
Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

世界上存在着N个国家,简单起见,编号从0~N-1,假如a国和b国是盟国,b国和c国是盟国,那么a国和c国也是盟国。另外每个国家都有权宣布退盟(注意,退盟后还可以再结盟)。

定义下面两个操作:

“M X Y” :X国和Y国结盟

“S X” :X国宣布退盟

Input

多组case。

每组case输入一个N和M (1 ≤ N ≤ 100000 , 1 ≤ M ≤ 1000000),N是国家数,M是操作数。

接下来输入M行操作

当N=0,M=0时,结束输入

Output

对每组case输出最终有多少个联盟,格式见样例。

Sample Input

5 6
M 0 1
M 1 2
M 1 3
S 1
M 1 2
S 3
3 1
M 1 2
0 0

Sample Output

Case #1: 3
Case #2: 2
 
超时超时超时.....
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 
 7 int f[1000002];
 8 bool use[1000002];
 9 int cnt;
10 int n,m;
11 int find(int x)
12 {
13     int i=x,r;
14     while(f[x]!=x)
15         x=f[x];
16     while(i!=x)
17     {
18         r=f[i];
19         f[i]=x;
20         i=r;
21     }
22     return x;
23 }
24 void Union(int x,int y)
25 {
26     int x1,y1;
27     x1=find(x);
28     y1=find(y);
29     if(x1==y1) return;
30     else
31     {
32         if(x1<n && y1<n)
33         {
34             f[x1]=cnt;
35             f[y1]=cnt++;
36         }
37         else if(x1>=n || y1>=n)
38         {
39             if(x1>=n)
40                 f[y1]=x1;
41             else f[x1]=y1;
42         }
43     }
44 }
45 int main()
46 {
47     int i,k,x,y,Num,t=0;
48     char cur[5];
49     while(scanf("%d%d",&n,&m)>0)
50     {
51         if(n==0&&m==0)break;
52         for(i=0;i<=m;i++)
53         {
54             f[i]=i;
55             use[i]=false;
56         }
57         cnt=n+1;
58         for(i=1;i<=m;i++)
59         {
60             scanf("%s",cur);
61             if(cur[0]=='M')
62             {
63                 scanf("%d%d",&x,&y);
64                 Union(x,y);
65             }
66             else if(cur[0]=='S')
67             {
68                 scanf("%d",&x);
69                 f[x]=x;
70             }
71         }
72         Num=0;
73         for(i=0;i<n;i++)
74             find(i);
75         for(i=0;i<n;i++)
76         {
77             k=f[i];
78             use[k]=true;
79         }
80         for(i=0;i<=m;i++)
81             if(use[i]==true) Num++;
82         printf("Case #%d: ",++t);
83         printf("%d
",Num);
84     }
85     return 0;
86 }
原文地址:https://www.cnblogs.com/tom987690183/p/3621563.html