HDU 1814 Peaceful Commission
2-SAT,输出字典序最小的解,白书模板。
//TwoSAT输出字典序最小的解的模板 //注意:0,1是一组,1,2是一组..... #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=8000+5; int m; struct TwoSAT { int n; vector<int> G[maxn*2]; bool mark[maxn*2]; int S[maxn*2],c; bool dfs(int x) { if(mark[x^1]) return false; if(mark[x]) return true; mark[x]=true; S[c++]=x; for(int i=0;i<G[x].size();i++) if(!dfs(G[x][i])) return false; return true; } void init(int n) { this->n=n; for(int i=0;i<n*2;i++) G[i].clear(); memset(mark,0,sizeof mark); } void add_clause(int x,int y) { G[x].push_back(y^1); G[y].push_back(x^1); } bool solve() { for(int i=0;i<2*n;i+=2) if(!mark[i]&&!mark[i+1]) { c=0; if(!dfs(i)) { while(c>0) mark[S[--c]]=false; if(!dfs(i+1)) return false; } } return true; } //输出字典序最小的解 void Printf() { for(int i=0;i<n;i++) { if(mark[2*i]) printf("%d\n",2*i+1); else printf("%d\n",2*i+1+1); } } }; int main() { TwoSAT T; while(~scanf("%d%d",&T.n,&m)) { T.init(T.n); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); a--;b--; T.add_clause(a,b); } if(T.solve()) T.Printf(); else printf("NIE\n"); } return 0; }