思路
带边权并查集
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
unordered_map<int,int> S;
const int N=20010;
int p[N];
int d[N];//到根节点的距离
int n,m;
int find(int x){
if(p[x]!=x){
int root = find(p[x]);
d[x] += d[p[x]];
p[x] = root;
}
return p[x];
}
int get(int x){//离散化
if(S.count(x)==0)S[x]=++n;
return S[x];
}
int main(){
cin >> n >> m;
n=0;
int res=m;
for (int i = 0; i < N; i ++ ) p[i] = i;
for(int i=1;i<=m;i++){
int a,b;
string t;
cin >> a >> b >> t;
a=get(a-1);b=get(b);//注意这里是a-1,因为查的是l-1和r的奇偶性
int pa=find(a);int pb=find(b);
int temp=0;
if (t == "odd") temp = 1;
if(pa==pb){
if(((d[a] + d[b]) % 2 + 2) % 2 !=temp){
res=i-1;
break;
}
}else{
p[pa]=pb;
d[pa]=d[a]^d[b]^temp;
}
}
cout << res;
}
大佬写的太棒了
我才发现自己以前写的太麻烦了