HDU 1814 Peaceful Commission
生活随笔
收集整理的這篇文章主要介紹了
HDU 1814 Peaceful Commission
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/zufezzt/p/4906130.html
總結(jié)
以上是生活随笔為你收集整理的HDU 1814 Peaceful Commission的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码天敌之体积
- 下一篇: FL2440的U-boot-2009.0