码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5285 BestCoder Round #48 ($) 1002 种类并查集

时间:2015-07-18 22:34:24      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

// M == 0 有trick... N < 2 也有trick......

  1 #include"iostream"
  2 #include"cstdio"
  3 #include"cstring"
  4 #include"map"
  5 using namespace std;
  6 int N, M;
  7 int rt[100010], w[100010];
  8 int Size[100010], Friend[100010];
  9 
 10 int n,m,l,r;
 11 char str[10];
 12 
 13 void paco(int a)
 14 {
 15     if(rt[a]==a) {
 16         return ;
 17     }
 18     paco(rt[a]);
 19     w[a] ^= w[rt[a]];
 20     rt[a] = rt[rt[a]];
 21 }
 22 
 23 bool unio(int a, int b)
 24 {
 25     paco(a);
 26     paco(b);
 27     int rt_a = rt[a],rt_b = rt[b];
 28     if(rt_a==rt_b) {
 29         return w[a] != w[b];
 30     }
 31     else {
 32         rt[rt_a] = rt_b;
 33         w[rt_a] = (w[a] == w[b]);
 34         if(w[rt_a] == 0) {
 35             Friend[rt_b] += Friend[rt_a];
 36         }
 37         else {
 38             Friend[rt_b] += (Size[rt_a] - Friend[rt_a]);
 39         }
 40         Size[rt_b] += Size[rt_a];
 41     }
 42     return true;
 43 }
 44 
 45 int main()
 46 {
 47     int i, T;
 48     scanf("%d", &T);
 49     while(T--) {
 50         memset(w, 0, sizeof(w));
 51         scanf("%d%d", &N, &M);
 52         if(N < 2) {
 53             printf("Poor wyh\n");
 54             continue;
 55         }
 56         for(i = 0; i <= N; ++i) {
 57             rt[i] = i;
 58             Size[i] = 1;
 59             Friend[i] = 1;
 60         }
 61         int i;
 62         int u, v;
 63         bool ok = 1;
 64         for(i = 1; i <= M; ++i) {
 65             scanf("%d%d", &u, &v);
 66 //            if(w[u] == -1) {
 67 //                w[u] = 0;
 68 //            }
 69 //            if(w[v] == -1) {
 70 //                w[v] = 0;
 71 //            }
 72             if(!unio(u, v)) {
 73                 ok = 0;
 74             }
 75 //            int j;
 76 //            for(j = 1; j <= N; ++j) {
 77 //                printf("w[%d] == %d   rt[%d] == %d\n", j, w[j], j, rt[j]);
 78 //            }
 79 //            printf("\n");
 80         }
 81         if(ok) {
 82             int res = 0;
 83             for(i = 1; i <= N; ++i) {
 84                 if(rt[i] == i) {
 85                     res += min(Friend[i], Size[i] - Friend[i]);
 86                 }
 87             }
 88             int Max = N - res;
 89             int Min = res;
 90             if(Max < Min) {
 91                 swap(Max, Min);
 92             }
 93             if(Max == N) {
 94                 --Max;
 95                 ++Min;
 96             }
 97             printf("%d %d\n", Max, Min);
 98         }
 99         else {
100             printf("Poor wyh\n");
101         }
102     }
103 }

 

hdu 5285 BestCoder Round #48 ($) 1002 种类并查集

标签:

原文地址:http://www.cnblogs.com/AC-Phoenix/p/4657758.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!