# include <stdio.h>
# include <algorithm>
# include <string.h>
# include <stack>
using namespace std;
# define MAXN 6010
# define MAXM 10010
struct node
{
int to;
int next;
} edge[MAXM];
int tot;
int tim,num;
int be[MAXN];
bool instack[MAXN];
int dfn[MAXN],low[MAXN];
int head[MAXN];
int pos[MAXN];
stack<int>s;
int n,m;
void init()
{
tot=0;
memset(head,-1,sizeof(head));
}
void add(int from,int to)
{
edge[tot].to=to;
edge[tot].next=head[from];
head[from]=tot++;
}
void tarjan(int cur)
{
dfn[cur]=low[cur]=++tim;
s.push(cur);
instack[cur]=true;
for(int i=head[cur]; i!=-1; i=edge[i].next)
{
int to=edge[i].to;
if(!dfn[to])
{
tarjan(to);
low[cur]=min(low[cur],low[to]);
}
else if(instack[to])
{
low[cur]=min(low[cur],dfn[to]);
}
}
if(dfn[cur]==low[cur])
{
int tem = -1;
++num;
while(tem != cur)
{
tem = s.top();
s.pop();
instack[tem] = false;
be[tem] = num;
}
}
}
void solve()
{
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(instack,0,sizeof(instack));
memset(be,0,sizeof(be));
while(!s.empty())
s.pop();
tim=num=0;
for(int i=0; i<2*n; i++)
{
if(!dfn[i])
tarjan(i);
}
bool ans=true;
for(int i=0; i<2*n; i++)
{
if(be[i]==be[i+n])
{
ans=false;
break;
}
}
if(ans)
puts("yes");
else
puts("no");
}
int main()
{
int x,y,z;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0; i<n; i++)
{
scanf("%d%d%d",&x,&y,&z);
pos[x]=i;
pos[y]=pos[z]=i+n;
}
for(int i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
if(pos[x]>=n)
add(pos[x]-n,pos[y]);
else
add(pos[x]+n,pos[y]);
if(pos[y]>=n)
add(pos[y]-n,pos[x]);
else
add(pos[y]+n,pos[x]);
}
solve();
}
return 0;
}
hdu 1824 Let's go home (2-sat)
最新推荐文章于 2019-11-17 10:04:11 发布