hdu 2473 Junk-Mail Filter

http://acm.hdu.edu.cn/showproblem.php?pid=2473

并查集设置虚拟父节点。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define maxn 1100000

 5 using namespace std;

 6 

 7 int f[maxn],num[maxn];

 8 int in[maxn],n,m;

 9 

10 void inti()

11 {

12     for(int i=0; i<n; i++)

13     {

14         f[i]=in[i]=i;

15         num[i]=1;

16     }

17 }

18 

19 int find1(int x)

20 {

21     if(x==f[x]) return x;

22     return f[x]=find1(f[x]);

23 }

24 

25 void merge1(int a,int b)

26 {

27     int fa=find1(a);

28     int fb=find1(b);

29     if(fa!=fb)

30     {

31         f[fa]=fb;

32         num[fb]+=num[fa];

33         num[fa]=0;

34     }

35 }

36 

37 int main()

38 {

39     int ca=1;

40     while(scanf("%d%d",&n,&m)!=EOF)

41     {

42         inti();

43         if(n==0&&m==0) break;

44         getchar();

45         char ch;

46         int ans=n;

47         int u,v;

48         for(int i=1; i<=m; i++)

49         {

50             scanf("%c",&ch);

51             if(ch=='M')

52             {

53 

54                 scanf("%d%d",&u,&v);

55                 merge1(in[u],in[v]);

56             }

57             else if(ch=='S')

58             {

59                 scanf("%d",&v);

60                 int f1=find1(in[v]);

61                 num[f1]--;

62                 in[v]=ans;

63                 f[ans]=ans;

64                 num[ans]=1;

65                 ans++;

66             }

67             getchar();

68         }

69         int t1=0;

70         for(int i=0; i<ans; i++)

71         {

72             if(num[i]>0) t1++;

73         }

74         printf("Case #%d: %d\n",ca++,t1);

75     }

76     return 0;

77 }
View Code

 

 

你可能感兴趣的:(filter)