poj1182

本文地址:http://www.javashuo.com/article/p-uebwlyxr-br.htmlhtml

題目名稱:食物鏈ide

連接:http://poj.org/problem?id=1182spa

題意:中文題,本身看
code

思路:考察並查集。因爲有三種動物,且不知種類,因此咱們得分爲三組i-A,i-B,i-C。i-X表示i屬於種類Xhtm

若x和y同種,則合併x-A和y-A,x-B和y-B,x-C和y-C.blog

若x吃y,則合併x-A和y-B,x-B和y-C,x-C和y-Aget

代碼以下:it

 

 1 #include<cstdio>
 2 using namespace std;  3 const int MAX_K = 100005;  4 int n, k;  5 int f[50000 * 3 + 5];  6 void init(int n) {  7     for(int i = 0; i < n; i++){  8         f[i] = i;  9  } 10 } 11 int found(int x) { 12     return f[x] == x ? x : f[x] = found(f[x]); 13 } 14 void unite(int x,int y) { 15     x = found(x), y = found(y); 16     if(x != y){ 17         f[x] = y; 18  } 19     return ; 20 } 21 bool same(int x,int y) { 22     return found(x) == found(y); 23 } 24 int main(){ 25     scanf("%d%d", &n, &k); 26     init(n * 3); 27     int sum = 0; 28     while(k--) { 29         int d, x, y; 30         scanf("%d%d%d", &d, &x, &y); 31         x--; y--; 32         if(x < 0 || y < 0 || x >= n || y >= n) { 33             sum++; 34             continue; 35  } 36         if(d == 1) { 37             //x和y爲同類,判斷x吃y或者y吃x爲假
38             if(same(x, y + n) || same(y, x + n)) { 39                 sum++; 40  } 41             else { 42  unite(x, y); 43                 unite(x + n, y + n); 44                 unite(x + 2 * n, y + 2 * n); 45  } 46  } 47         else { 48             //x吃y,判斷x和y同類,或者y吃x爲假
49             if(same(x, y) || same(y, x + n)){ 50                 sum++; 51  } 52             else{ 53                 unite(x, y+n); 54                 unite(x + n, y + 2 * n); 55                 unite(x + 2 * n, y); 56  } 57  } 58  } 59     printf("%d\n",sum); 60     return 0; 61 }
View Code
相關文章
相關標籤/搜索