第一次接触2-sat的题目,建图是关键,下面的文章讲的挺好的: http://www.chenyajun.com/2010/01/18/4282 http://www.answeror.com/archives/26184 #include<iostream> using namespace std; #define N 2005 typedef struct node* pointer; struct node { int ver; pointer next; }; pointer g[N]; struct edge { int s,t; }; edge edg[N]; int ord[N],low[N],id[N],stk[N],re[N],cnt,scnt; bool instk[N]; void insert(int u,int v) { pointer ptr=new node; ptr->ver=v; ptr->next=g[u]; g[u]=ptr; } void tarjan(int e) { int t; pointer ptr; low[e]=++cnt; ord[e]=cnt; stk[++stk[0]]=e; instk[e]=true; ptr=g[e]; while(ptr!=NULL) { t=ptr->ver; if(!ord[t]) { tarjan(t); if(low[e]>low[t]) low[e]=low[t]; } else if(instk[t]&&low[e]>ord[t]) low[e]=ord[t]; ptr=ptr->next; } if(low[e]==ord[e]) { scnt++; do { t=stk[stk[0]--]; id[t]=scnt; instk[t]=false; }while(t!=e); } return ; } void find_component(int n) { memset(ord,0,sizeof(ord)); memset(instk,0,sizeof(instk)); cnt=0,scnt=0,stk[0]=0; for(int i=1;i<=n;i++) if(!ord[i]) tarjan(i); return ; } int main() { int n,m,x,y,i,j,temp,h,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); x++,y++; if(x>y) { temp=x,x=y,y=temp; } edg[i].s=x,edg[i].t=y; } for(i=1;i<=2*n;i++) g[i]=NULL; for(i=1;i<=m;i++) for(j=i+1;j<=m;j++) { if((edg[i].s<edg[j].s&&edg[j].s<edg[i].t &&edg[j].t>edg[i].t) ||(edg[i].s>edg[j].s&&edg[i].s<edg[j].t &&edg[j].t<edg[i].t)) { h=edg[i].s,k=edg[j].s; insert(2*h,2*k-1); insert(2*k-1,2*h); insert(2*k,2*h-1); insert(2*h-1,2*k); } } find_component(2*n); for(i=1;i<=n;i++) if(id[2*i-1]==id[2*i]) { printf("the evil panda is lying again/n"); return 0; } printf("panda is telling the truth.../n"); return 0; }