poj 3207 2-sat
来源:互联网 发布:山东淘宝拍卖会 编辑:程序博客网 时间:2024/06/09 18:46
#include<iostream>#include<cstring>#include<vector>#include<cstdio>using namespace std;int n_point;int n_line;#define N 1005struct Point{ int x,y;};Point point[N];vector <int> g[N];int used[N];int cnt;int order[N];int n;int id[N];int ID;void dfs1( int u );int valid(int x,int y);void dfs2( int u );void scc();bool sat_judge();int main(){ cin>>n_point; cin>>n_line; for(int i=0;i<n_line;i++) { scanf("%d%d",&point[i].x,&point[i].y); if(point[i].x>point[i].y) { int tmp=point[i].x; point[i].x=point[i].y; point[i].y=tmp; } for(int j=0;j<i;j++) { if(!valid(i,j)) { g[2*i].push_back(2*j+1); g[2*j+1].push_back(2*i); g[2*i+1].push_back(2*j); g[2*j].push_back(2*i+1); } } } n=2*n_line; scc(); if(!sat_judge()){cout<<"the evil panda is lying again"<<endl;} else cout<<"panda is telling the truth..."<<endl;}void dfs1( int u ){ vector<int>::iterator v; used[u] = true; for(v = g[u].begin(); v != g[u].end(); v++) if(!used[*v]) dfs1(*v); order[cnt++] = u;}void dfs2( int u ){ vector<int>::iterator v; used[u] = true; id[u] = ID; for(v = g[u].begin(); v != g[u].end(); v++) if(!used[*v]) dfs2(*v);}void scc(){ memset(used , 0 , sizeof(used)); cnt = 0; for(int i=0; i < n; i++) if(!used[i]) dfs1(i); memset(used , 0 , sizeof(used)); ID = 0; for(int i=cnt - 1; i >= 0 ; i--) if(!used[ order[i] ]){ ID ++; dfs2( order[i] ); }}int valid(int x,int y){ if(point[x].x<point[y].y&&point[x].y>point[y].y&&point[x].x>point[y].x) return 0; if(point[x].x<point[y].x&&point[x].y>point[y].x&&point[x].y<point[y].y) return 0; return 1;}bool sat_judge(){for(int i=0; i < n; i+=2) if(id[i] == id[i+1]) return false; return true;}