第一种类型:x y even 表示 sum [y] - sum [x] == 偶数, 那么可以推测出:sum [y] 与 sum [x] 的奇偶性相同。
第二种类型:x y odd 表示 sum [y] - sum [x] == 奇数, 那么可以推测出:sum [y] 与 sum [x] 的奇偶性不同。
带权并查集解法
如果我们这题要使用带权并查集的话,我们考虑两个数 u 与 v 的奇偶性情况:
奇偶性相同:那么那么就相当于 u 与 v 之间的距离为 0, 在合并的时候我我们可以根据这个按照实际意义推出合并的表达式。
奇偶性不同:那么那么就相当于 u 与 v 之间的距离为 1,在合并的时候我们也可以推测出 d (fu) 的值
带值并查集
#include<bits/stdc++.h>
using namespace std;constint N =1e4+10;int n, m;
unordered_map<int,int> mp;int f[N], d[N];intget(int x){if(mp.count(x)==0) mp[x]=++ n;return mp[x];}intfind(int x){if(f[x]!= x){int root =find(f[x]);
d[x]+= d[f[x]];
f[x]= root;}return f[x];}intmain(){scanf("%d %d",&n,&m);
n =0;for(int i =1; i < N; i ++) f[i]= i;int res = m;int x, y;char type[10];for(int i =1; i <= m; i ++){scanf("%d %d %s",&x,&y, type);
x =get(x -1), y =get(y);int fx =find(x), fy =find(y);int t =0;if(type[0]=='o') t =1;if(fx == fy){if(((d[x]+ d[y])%2+2)%2!= t){
res = i -1;break;}}else{
f[fx]= fy;
d[fx]= d[x]^ d[y]^ t;}}printf("%d\n", res);return0;}
种类并查集
#include<bits/stdc++.h>
using namespace std;constint N =2e4+10;int n, m;int f[N];
unordered_map<int,int> mp;intget(int x){if(mp.count(x)==0) mp[x]=++ n;return mp[x];}intfind(int x){if(f[x]!= x) f[x]=find(f[x]);return f[x];//这里必须返回 f[x] , 对于这种递归方式}intmain(){scanf("%d %d",&n,&m);
n =0;for(int i =1; i < N; i ++) f[i]= i;int x, y;char type[10];int res = m;for(int i =1; i <= m; i ++){scanf("%d %d %s",&x,&y, type);
x =get(x -1), y =get(y);if(type[0]=='e'){if(find(x + N /2)==find(y)){
res = i -1;break;}
f[find(x)]=find(y);
f[find(x + N /2)]=find(y + N /2);}else{if(find(x)==find(y)){
res = i -1;break;}
f[find(x)]=find(y + N /2);
f[find(y)]=find(x + N /2);}}printf("%d\n", res);return0;}