标签:sizeof 问题 建立 names string for scan cstring span
题解:本题的模型是:A,B二者中间必须选一个,那么选B‘就必须选A,选A‘就必须选B,连边即可。
然后想了半天如何输出方案,结果看题解说直接暴力枚举每个议案是否通过就行了(还有这种操作?)
#include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; int to[20010],next[20010],ans[2010],head[2010],color[2010]; int n,m,cnt,tot,top,sum; queue<int> q; char str[5]; void add(int a,int b) { to[cnt]=b,next[cnt]=head[a],head[a]=cnt++; } void dfs(int x) { if(color[x]) return ; color[x]=1; for(int i=head[x];i!=-1;i=next[i]) dfs(to[i]); } bool check(int x) { memset(color,0,sizeof(color)); dfs(x); for(int i=0;i<n;i++) if(color[i<<1]&&color[i<<1|1]) return 0; return 1; } int main() { scanf("%d%d",&n,&m); int i,j,u,a,b; memset(head,-1,sizeof(head)); for(i=1;i<=m;i++) { scanf("%d %s",&a,str),a=(a-1)<<1; if(str[0]==‘N‘) a|=1; scanf("%d %s",&b,str),b=(b-1)<<1; if(str[0]==‘N‘) b|=1; add(a^1,b),add(b^1,a); } for(i=0;i<n;i++) { ans[i<<1]=check(i<<1),ans[i<<1|1]=check(i<<1|1); if(!ans[i<<1]&&!ans[i<<1|1]) { printf("IMPOSSIBLE\n"); return 0; } } for(i=0;i<n;i++) { if(ans[i<<1]&&ans[i<<1|1]) printf("?"); else if(ans[i<<1]) printf("Y"); else printf("N"); } return 0; }
【BZOJ2199】[Usaco2011 Jan]奶牛议会 2-SAT
标签:sizeof 问题 建立 names string for scan cstring span
原文地址:http://www.cnblogs.com/CQzhangyu/p/7044306.html