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;}