在不知道拓扑排序的情况下逗比的实现回路……
注意大坑:输入fi[i].x1与fi[i].x2相同时,输出NO。
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
struct A
{
int x1,x2;
};
int ma[105][105];
A fi[10005];
bool cmp1(A a,A b)
{
return a.x1<b.x1;
}
bool cmp2(A a,A b)
{
return a.x2<b.x2;
}
int main()
{
int n,m,a,b;
while (cin>>n>>m)
{
memset(ma, 0, sizeof(ma));
for(int i=0;i<m;i++)
{
cin>>fi[i].x1>>fi[i].x2;
}
int sign=1;
for(int i=0;i<m;i++)
{
a=fi[i].x1,b=fi[i].x2;
if(fi[i].x1==fi[i].x2) {sign=0;cout<<"NO"<<endl;break;}
if(a>b)
{
if(ma[b][a]!=-1)
ma[b][a]=1;
else
{
sign=0;cout<<"NO"<<endl;
break;
}
}
else
{
if(ma[a][b]!=1)
ma[a][b]=-1;
else
{
sign=0;cout<<"NO"<<endl;
break;
}
}
}
if(sign==0) continue;
sort(fi, fi+m, cmp1);
for(int i=0;i<m;i++)
{
a=fi[i].x1,b=fi[i].x2;
if(a>b)
{
for(int j=1;j<b;j++)
{
if(ma[j][b]==1)
{
if(ma[j][a]!=-1) ma[j][a]=1;
else
{
sign=0;cout<<"NO"<<endl;
break;
}
}
}
}
if(sign==0) break;
}
sort(fi, fi+m, cmp2);
for(int i=0;i<m;i++)
{
a=fi[i].x1,b=fi[i].x2;
if(a<b)
{
for(int j=1;j<a;j++)
{
if(ma[j][a]==-1)
{
if(ma[j][b]!=1) ma[j][b]=-1;
else
{
sign=0;cout<<"NO"<<endl;
break;
}
}
}
}
if(sign==0) break;
}
if(sign==1) cout<<"YES"<<endl;
}
}