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 }