全WA求助
查看原帖
全WA求助
1074084
asd890123楼主2025/6/27 18:42

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;
}
2025/6/27 18:42
加载中...