拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

时间:2022-09-07 17:05:07
 //拓扑排序判断是否有环
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e2+;
int G[maxn][maxn];
int in[maxn];
void init()
{
memset(G,,sizeof(G)); //图
memset(in,,sizeof(in)); //入度
}
int Toposort(int n)
{
int aim;
int cot=;
int flag=; //1的时候表示有序
//每一次循环,找出入度为0的点,如果找不到就证明有环(这点强行记忆)
//找到之后,将这个点所连的边的另一个端点入度-1;
//算法结束
for(int i=;i<=n;i++){
int num=;
for(int j=;j<=n;j++)
if(!in[j]){
num++;
aim=j;
break;
}
if(!num) return ; //有环;
in[aim]=-;
for(int j=;j<=n;j++)
if(G[aim][j]) in[j]--;
}
return flag; }
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init(); //初始化
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v]=;
in[v]++; //u到v有边 所以v的入度++;
}
int flag=Toposort(n);
if(flag==) printf("YES\n");
else printf("NO\n");
}
return ;
}

.