花了一天弄明白了,自己代码里边写成双向了,蛋疼.
纪念一下.
模板:
View Code
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int SIZE=3000;
typedef struct edge
{
int t;
edge* next;
}edge;
edge g[1000000];
edge* head[SIZE];
int cnt;
int top;
int stk[SIZE];
int dfn[SIZE];
int low[SIZE];
bool instk[SIZE];
int group[SIZE];
int nIndex;
int tag;
int N,M;
inline void add_edge(int s,int t)
{
g[cnt].t=t;
g[cnt].next=head[s];
head[s]=&g[cnt++];
}
void build()
{
cnt=0;
for(int i=0;i<N*2;i++)
head[i]=NULL;
int a1,a2,c1,c2;
for(int i=0;i<M;i++)
{
scanf("%d%d%d%d",&a1,&a2,&c1,&c2);
add_edge(a1*2+c1,a2*2+(c2^1));
add_edge(a2*2+c2,a1*2+(c1^1));
}
}
void Tarjan(int x)
{
low[x]=dfn[x]=++nIndex;
instk[x]=true;
stk[++top]=x;
for(edge* p=head[x];p;p=p->next)
{
if(!dfn[p->t])
{
Tarjan(p->t);
low[x]=min(low[x],low[p->t]);
}
else
{
if(instk[p->t])
low[x]=min(low[x],dfn[p->t]);
}
}
if(dfn[x]==low[x])
{
tag++;
int tmp;
do
{
tmp=stk[top--];
instk[tmp]=false;
group[tmp]=tag;
}while(tmp!=x);
}
}
bool work()
{
nIndex=0;
tag=0;
top=0;
memset(instk,false,sizeof(instk));
memset(dfn,0,sizeof(dfn));
for(int i=0;i<2*N;i++)
if(!dfn[i])
Tarjan(i);
for(int i=0;i<2*N;i+=2)
{
if(group[i]==group[i+1])
return false;
}
return true;
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&N,&M)!=EOF && (N || M))
{
build();
if(work())
puts("YES");
else
puts("NO");
}
return 0;
}