#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
int n_point;
int n_line;
#define N 1005
struct 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;
}
poj 3207 2-sat
最新推荐文章于 2018-09-22 10:24:01 发布