1 条题解

  • 0
    @ 2026-10-25 23:05:41

    思路

    每党两个代表互为否定,每个冲突(a,b)编码a蕴含非b与b蕴含非a;同党两文字同SCC时不可行,否则按凝聚图顺序取一人。必须升序输出,任意合法委员会均应通过,不能使用固定答案比较。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    vector<int>components(const vector<vector<int>>&g,const vector<vector<int>>&rev,int &count){int n=g.size();vector<int>seen(n),order,next(n);for(int s=0;s<n;s++)if(!seen[s]){vector<int>st(1,s);seen[s]=1;while(!st.empty()){int u=st.back();if(next[u]<(int)g[u].size()){int v=g[u][next[u]++];if(!seen[v]){seen[v]=1;st.push_back(v);}}else{order.push_back(u);st.pop_back();}}}vector<int>c(n,-1);count=0;for(auto it=order.rbegin();it!=order.rend();++it)if(c[*it]<0){vector<int>st(1,*it);c[*it]=count;while(!st.empty()){int u=st.back();st.pop_back();for(int v:rev[u])if(c[v]<0){c[v]=count;st.push_back(v);}}count++;}return c;}
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int parties,m;cin>>parties>>m;int n=2*parties;vector<vector<int>>g(n),rev(n);for(int i=0;i<m;i++){int a,b;cin>>a>>b;--a;--b;g[a].push_back(b^1);rev[b^1].push_back(a);g[b].push_back(a^1);rev[a^1].push_back(b);}int count;auto c=components(g,rev,count);for(int i=0;i<n;i+=2)if(c[i]==c[i+1]){cout<<"NIE\n";return 0;}for(int i=0;i<n;i+=2){int chosen=c[i]>c[i+1]?i:i+1;cout<<chosen+1<<'\n';}}
    
    • 1

    信息

    ID
    1584
    时间
    1000ms
    内存
    128MiB
    难度
    普及+
    标签
    递交数
    5
    已通过
    1
    上传者