hdu2860 并查集模拟

判断条件有点坑

  1 #include<iostream>

  2 #include<cstdio>

  3 #include<cstdlib>

  4 #include<cstring>

  5 #include<string>

  6 #include<queue>

  7 #include<algorithm>

  8 #include<map>

  9 #include<iomanip>

 10 #include<climits>

 11 #define INF 1e11

 12 #define MAXN 100010

 13 using namespace std;

 14 

 15 #define _min(a,b) (((a)<(b))?((a):(b)))

 16 //适用于正负整数

 17 template <class T>

 18 inline bool scan_d(T &ret) {

 19     char c; int sgn;

 20     if (c = getchar(), c == EOF) return 0; //EOF

 21     while (c != '-' && (c<'0' || c>'9')) c = getchar();

 22     sgn = (c == '-') ? -1 : 1;

 23     ret = (c == '-') ? 0 : (c - '0');

 24     while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');

 25     ret *= sgn;

 26     return 1;

 27 }

 28 typedef long long LL;

 29 

 30 struct soldier{

 31     int rate, com;

 32 }s[MAXN];

 33 struct Com{

 34     LL low;

 35     int num;

 36     Com(){

 37         low = INF;

 38         num = 0; 

 39     }

 40 }c[MAXN];

 41 int fa[MAXN];

 42 int n, m, k;

 43 int x, y;

 44 string o;

 45 

 46 

 47 int find(int x)

 48 {

 49     if (fa[x]  == x) return x;

 50     return fa[x] = find(fa[x]);

 51 }

 52 

 53 void init()

 54 {

 55     for (int i = 0; i < MAXN; ++i)

 56         fa[i] = i,c[i].low = INF,c[i].num = 0;

 57 }

 58 

 59 bool merge(int a,int b)

 60 {

 61     int x = find(a);

 62     int y = find(b);

 63     if (x == y) return true;

 64     else if (x != y) {

 65         if (c[x].low > c[y].low) c[x].low = c[y].low;

 66         c[x].num += c[y].num;

 67         fa[y] = x;

 68     }

 69     return false;

 70 }

 71 int main()

 72 {

 73     //n companies, k soldiers  m orders

 74     while (cin >> n >> k >> m) {

 75         init();

 76         for (int i = 0; i < k; ++i) {

 77             scan_d(s[i].rate);

 78             scan_d(s[i].com);

 79             c[s[i].com].num++;

 80             if (c[s[i].com].low > s[i].rate)

 81             c[s[i].com].low = s[i].rate;

 82         }

 83         for (int i = 0; i < m; ++i) {

 84             cin >> o;

 85             if (o == "GT"){

 86                 scan_d(x);

 87                 if (find(x) == x && c[x].num != 0) printf("Lowest rate: %I64d.\n",c[x].low);

 88                 else if (find(x) == x && c[x].num == 0) printf("Company %d is empty.\n", x);

 89                 else printf("Company %d is a part of company %d.\n",x,fa[x]);

 90             }

 91             else if (o == "MG") {

 92                 scan_d(x);  scan_d(y);

 93                 if (x != find(x) || y != find(y) || merge(x,y)) puts("Reject");

 94                 else puts("Accept");

 95             }

 96             else if (o == "AP") {

 97                 scan_d(x);  scan_d(y);

 98                 if (y != find(y)) {

 99                     puts("Reject");

100                     continue;

101                 }

102                 if (c[y].low > x) c[y].low = x;

103                 c[y].num++;

104                 puts("Accept");

105             }

106         }

107         puts("");

108     }

109     return 0;

110 }

 

你可能感兴趣的:(HDU)