标签:printf acl code ott val 输出 编号 proc tom
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3378 Accepted Submission(s): 1110
//2-sat模板,白书323页。点的编号从0开始 //输出字典序最小的结果,模板跑出来就是字典序最小的。 #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=8003; /********************** 2-sat模板 **********************/ 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<(int)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);//选了x就必须选y^1 g[y].push_back(x^1); } bool solve(){ for(int i=0;i<n*2;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; } }; /*********************** 2-sat模板 ************************/ int main(){ int n,m,a,b; Twosat solver; while(~scanf("%d%d",&n,&m)){ solver.init(n); for(int h=0;h<m;h++){ scanf("%d%d",&a,&b);//a,b不能同时选 a--;b--; solver.add_clause(a,b); } if(solver.solve()){ for(int i=0;i<n*2;i++) if(solver.mark[i]) printf("%d\n",i+1); } else printf("NIE\n"); } return 0; }
标签:printf acl code ott val 输出 编号 proc tom
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6359911.html