Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 113794 | Accepted: 34597 |
Description
Input
Output
Sample Input
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
Sample Output
3
Source
1 #include <cstdio> 2 #include <iostream> 3 4 5 using namespace std; 6 7 const int max_N=50000+2; 8 const int max_K=1e5+2; 9 int N,K; 10 int T[max_K],X[max_K],Y[max_K]; 11 12 // 并查集的实现 13 // 三个并查集 14 int par[max_N*3]; 15 int ranks[max_N*3]; 16 17 void init(int n) 18 { 19 for(int i=0;i<n;++i) 20 { 21 par[i]=i; 22 ranks[i]=0; 23 } 24 } 25 26 // 寻找所属的类的编号,并优化路径上的所有点 27 int finds(int x) 28 { 29 if(par[x]==x) 30 { 31 return x; 32 } 33 else 34 { 35 // 路径压缩 36 return par[x]=finds(par[x]); 37 } 38 } 39 40 // 并查集合并操作 41 void unite(int x,int y) 42 { 43 x=finds(x); 44 y=finds(y); 45 46 if(x==y) 47 { 48 return; 49 } 50 51 // 合并到深度大的那颗树 52 if(ranks[x]<ranks[y]) 53 { 54 par[x]=y; 55 } 56 else if(ranks[x]==ranks[y]) 57 { 58 // 随意连边,这边向y连边 59 par[x]=y; 60 ++ ranks[y]; 61 //par[y]=x;++ranks[x]; 62 } 63 else 64 { 65 par[y]=x; 66 } 67 } 68 69 bool same(int x,int y) 70 { 71 return finds(x)==finds(y); 72 } 73 74 void solve() 75 { 76 // 错误信息数 77 int ans=0; 78 // 初始化并查集 79 init(N*3); 80 81 for(int i=0;i<K;++i) 82 { 83 int x=X[i]-1; 84 int y=Y[i]-1; 85 86 if(x<0 || x>=N || y<0 || y>=N) 87 { 88 ++ans; 89 continue; 90 } 91 92 // X 与 Y 是同一类 93 if(T[i]==1) 94 { 95 96 // 冲突的情况 97 // 1. x吃y 98 // 2. y吃x 99 if(same(x,y+N) || same(y+2*N,x)) 100 { 101 ++ans; 102 } 103 else 104 { 105 unite(x,y); 106 unite(x+N,y+N); 107 unite(x+2*N,y+2*N); 108 } 109 } 110 // X 吃 Y 111 else 112 { 113 114 // 冲突的情况 115 // 1. x与y同一类 116 // 2. y吃x 117 if(same(x,y) || same(y+2*N,x)) 118 { 119 ++ans; 120 } 121 else 122 { 123 unite(x,y+N); 124 unite(x+N,y+2*N); 125 unite(x+2*N,y); 126 } 127 } 128 } 129 130 131 printf("%d\n",ans); 132 } 133 134 int main() 135 { 136 scanf("%d %d",&N,&K); 137 for(int i=0;i<K;++i) 138 { 139 scanf("%d %d %d",&T[i],&X[i],&Y[i]); 140 } 141 142 solve(); 143 144 return 0; 145 } 146 147 148 /* 149 150 100 7 151 1 101 1 152 2 1 2 153 2 2 3 154 2 3 3 155 1 1 3 156 2 3 1 157 1 5 5 158 */
原文:https://www.cnblogs.com/jishuren/p/12304657.html