RT,思路是把图分成连同块,如果有一个连通快颜色不同肯定挂,如果连通快全白ans不变,否则全黑且是欧拉回路则ans+1,0分代码:
#include<bits/stdc++.h>
const int N = 1000005;
struct EDGE{int v,w;};
bool not_Euler[N];
int fa[N],u[N],v[N],c[N],du[N];
std::set<int> st;
std::vector<int> group_line[N];
std::vector<int> group_point[N];
std::vector<EDGE> g[N];
int getroot(int x){return fa[x] == x ? x : fa[x] = getroot(fa[x]);}
int main(){
std::cin.tie(0)->sync_with_stdio(0);
int n,m;std::cin >> n >> m;
for (int i = 1;i <= n;i++) fa[i] = i;
for (int i = 0;i < m;i++){
std::cin >> u[i] >> v[i] >> c[i];
fa[getroot(u[i])] = getroot(v[i]);
++du[u[i]];++du[v[i]];
}
for (int i = 1;i <= n;i++) {
st.insert(getroot(i));
group_point[getroot(i)].push_back(i);
}
for (int i = 0;i < m;i++) group_line[getroot(u[i])].push_back(i);
for (int lead : st){
for (int point : group_point[lead])
if (du[point] % 2 != 0){
not_Euler[point] = 1;break;
}
}
int q;
for (std::cin >> q;q--;){
int op,x;std::cin >> op;
if (op == 1) std::cin >> x,c[x] ^= 1;
else{
int ans = 0;
for (int lead : st){
std::set<int> tmp;
for (int col : group_line[lead]) tmp.insert(c[col]);
if (tmp.size() != 1) goto nxt;
int col = *tmp.begin();
if (col == 0) continue;
else{
if (!not_Euler[lead]) ++ans;
else goto nxt;
}
}
std::cout << ans << '\n';continue;
nxt:std::cout << -1 << '\n';
}
}
return 0;
}