1001: 食物链(poj1182),直接贴代码,稍作可过

并查集

  1 //
  2 //  main.cpp
  3 //  携程1
  4 //
  5 //  Created by zhang on 14-4-11.
  6 //  Copyright (c) 2014年 apple. All rights reserved.
  7 //
  8 
  9 #include <iostream>
 10 #include <cstring>
 11 #include <cstdio>
 12 #include <cstdlib>
 13 #include <cmath>
 14 #include <string>
 15 #include <vector>
 16 #include <list>
 17 #include <map>
 18 #include <queue>
 19 #include <stack>
 20 #include <bitset>
 21 #include <algorithm>
 22 #include <numeric>
 23 #include <functional>
 24 
 25 using namespace std;
 26 const int maxk=100010;
 27 int N,K;
 28 int D[maxk],X[maxk],Y[maxk];
 29 int par[3*maxk],rankh[3*maxk];
 30 
 31 void init(int n)
 32 {
 33     for(int i=0;i<n;i++)
 34     {
 35         par[i]=i;
 36         rankh[i]=0;
 37     }
 38 }
 39 int find(int x)
 40 {
 41     if (par[x]==x)
 42     {
 43         return x;
 44     }
 45     else return par[x]=find(par[x]);
 46 }
 47 
 48 void unite(int x,int y)
 49 {
 50     x=find(x);
 51     y=find(y);
 52     if(x==y) return;
 53     
 54     if(rankh[x]<rankh[y])
 55     {
 56         par[x]=y;
 57     }
 58     else
 59     {
 60         par[y]=x;
 61         if(rankh[x]==rankh[y]) rankh[x]++;
 62     }
 63 }
 64 
 65 bool same(int x,int y)
 66 {
 67     return find(x)==find(y);
 68 }
 69 
 70 int main()
 71 {
 72     //freopen("Users/apple/Desktop/携程1/携程1.in","r",stdin);
 73     //freopen("Users/apple/Desktop/携程1/携程1.out","w",stdout);
 74     int T;
 75     scanf("%d",&T);
 76     while (T--) {
 77         
 78     scanf("%d%d",&N,&K);
 79     init(3*N);
 80     for(int i=0;i<K;i++)
 81     {
 82         scanf("%d %d %d",&D[i],&X[i],&Y[i]);
 83     }
 84     
 85     int ans=0;
 86     for(int i=0;i<K;i++)
 87     {
 88         int t=D[i];
 89         int x=X[i]-1,y=Y[i]-1;
 90         
 91         if(x<0||N<=x||y<0||N<=y)
 92         {
 93             ans++;
 94             continue;
 95         }
 96         if(t==1)
 97         {
 98             if(same(x,y+N)||same(x,y+2*N))
 99             {
100                 ans++;
101             }
102             else
103             {
104                 unite(x,y);
105                 unite(x+N,y+N);
106                 unite(x+2*N,y+2*N);
107             }
108         }
109         else
110         {
111             if (same(x,y)||same(x,y+2*N))
112                 ans++;
113             else
114             {
115                 unite(x,y+N);
116                 unite(x+N,y+2*N);
117                 unite(x+2*N,y);
118             }
119         }
120     }
121     
122     printf("%d\n",ans);
123     }
124     return 0;
125 }
1001

相关文章: