Description
Input
Accepted answers to the poll question | Encoding |
I would be happy if at least one from i and j is elected. | +i +j |
I would be happy if at least one from i and j is not elected. | -i -j |
I would be happy if i is elected or j is not elected or both events happen. | +i -j |
I would be happy if i is not elected or j is elected or both events happen. | -i +j |
Output
Sample Input
3 3 +1 +2 -1 +2 -1 -3 2 3 -1 +2 -1 -2 +1 -2 2 4 -1 +2 -1 -2 +1 -2 +1 +2 2 8 +1 +2 +2 +1 +1 -2 +1 -2 -2 +1 -1 +1 -2 -2 +1 -1
Sample Output
1 1 0 1
Hint
哎,模板题,
很坑,数据范围尽量开大了。
#include<cstdio> #include<cstring> #include<iostream> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define clr(f,z) memset(f,z,sizeof(f)) using namespace std; const int mm=222110; const int me=4e6+9; class Edge { public:int v,next; }; class candidate { public:char x[10],y[10]; }f[me]; class TWO_SAT { public: int dfn[mm],e_to[mm],stack[mm]; Edge e[me]; int edge,head[mm],top,dfs_clock,bcc; void clear() { edge=0;clr(head,-1); } void add(int u,int v) { e[edge].v=v;e[edge].next=head[u];head[u]=edge++; } void add_my(int x,int xval,int y,int yval) { x=x+x+xval;y=y+y+yval; add(x,y); } void add_clause(int x,int xval,int y,int yval) {///x or y x=x+x+xval; y=y+y+yval; add(x^1,y);add(y^1,x); } int tarjan(int u) { int lowu,lowv; lowu=dfn[u]=++dfs_clock; int v; stack[top++]=u; for(int i=head[u];~i;i=e[i].next) { v=e[i].v; if(!dfn[v]) { lowv=tarjan(v); lowu=min(lowv,lowu); } else if(e_to[v]==-1)//in stack lowu=min(lowu,dfn[v]); } if(dfn[u]==lowu) { ++bcc; do{ v=stack[--top]; e_to[v]=bcc; }while(v!=u); } return lowu; } bool find_bcc(int n) { clr(e_to,-1); clr(dfn,0); bcc=dfs_clock=top=0; FOR(i,0,2*n-1) if(!dfn[i]) tarjan(i); for(int i=0;i<2*n;i+=2) if(e_to[i]==e_to[i^1])return 0; return 1; } void getID(char*s,int&id,int&yes) { id=0; for(int i=0;s[i];++i) if(s[i]=='+')yes=1; else if(s[i]=='-')yes=0; else if(s[i]>='0'&&s[i]<='9')id=id*10+s[i]-'0'; } void build(int n,int m) { clear(); int a,b,c,d; FOR(i,1,m) { getID(f[i].x,a,b); getID(f[i].y,c,d); add_clause(a-1,b,c-1,d); } if(find_bcc(n+n))printf("1\n"); else printf("0\n"); } }two; int n,m; int main() { int a,b,c,d; //freopen("data.in","r",stdin); while(~scanf("%d%d",&n,&m)) { two.clear(); FOR(i,1,m) { scanf("%s%s",f[i].x,f[i].y); // scanf("%d%d",&a,&b); // c=a>0?a:-a; // d=b>0?b:-b; // --c;--d; // if(a>0&&b>0)two.add_clause(c,1,d,1); // if(a>0&&b<0)two.add_clause(c,1,d,0); // if(a<0&&b>0)two.add_clause(c,0,d,1); // if(a<0&&b<0)two.add_clause(c,0,d,0); } // if(two.find_bcc(n*2))printf("1\n"); // else printf("0\n"); two.build(n,m); // if(two.find_bcc(n))printf("YES\n"); // else printf("NO\n"); } return 0; }