题意:国家要进行选举,一共有n个党派,0~2*n-1个议员从零开始每两个都是同一个党派的,从中只能选择一个
然后每次选择的时候我们需要注意有一些是不能一起被选的
#include<cstdio>
#include<vector>
using namespace std;
enum{W,R,B};
#define maxn 16666
int col[maxn],cnt,ans[maxn];
vector<int>g[maxn];
int n,m;
int dfs(int v){
if(col[v]==B)return 0;
if(col[v]==R)return 1;
col[v]=R,col[v^1]=B;
ans[cnt++]=v; //当前搜索树所涂的颜色
int size=(int)g[v].size();
for(int i=0;i!=size;++i){
int u=g[v][i];
if(!dfs(u))return 0;
}
return 1;
}
int main(){
while(~scanf("%d%d",&n,&m)){
n=n<<1;
for(int i=0;i<n;++i)g[i].clear();
while(m--){
int a,b;
scanf("%d%d",&a,&b);
--a;--b;
g[a].push_back(b^1);
g[b].push_back(a^1);
}
int fl=1;
memset(col,0,sizeof col);
for(int i=0;i<n;++i){
if(col[i])continue;
cnt=0;
if(!dfs(i)){
for(int j=0;j<cnt;++j){
col[ans[j]]=W;
col[ans[j]^1]=W;
}
if(!dfs(i^1)){fl=0;break;}
}
}
if(fl){
for(int i=0;i<n;++i)
if(col[i]==R)
printf("%d\n",i+1);
}
else printf("NIE\n");
}
return 0;
}
解法:正解应该是2-sat 但是这里采用暴力O(n*m)