判断给定图是否存在合法拓扑排序

题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 

输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 

示例输入

1 0
2 2
1 2
2 1

示例输出

YES
NO
 1 #include<stdio.h>
 2 #include<string.h>
 3 int map[11][11],vis[11],degree[11];
 4 int main()
 5 {
 6     int n,m,u,v,i,j,k;
 7     while(~scanf("%d %d",&n,&m))
 8     {
 9         memset(map,0,sizeof(map));
10         memset(degree,0,sizeof(vis));//每个节点的入度初始为0;
11         while(m--)
12         {
13             scanf("%d %d",&u,&v);
14             map[u][v] = 1;
15             degree[v]++;//v的入度加1;
16         }
17         int w,flag = 1;
18         for( i = 1; i <= n; i++)
19         {
20             w = 0;//判断是否还有入度为0的点;
21             for( j = 1; j <= n; j++)
22             {
23                 if(degree[j] == 0)
24                 {
25                     w = 1;//若存在入度为0的点,标记为1;
26                     degree[j]--;//删除该顶点
27                     for( k = 1; k <= n; k++)
28                     {
29                         if(map[j][k])
30                             degree[k]--;
31                     }//删除以该顶点为首的所有有向边,即入度减1;
32                   break;
33                 }
34 
35             }
36             if(w == 0)//如果不存在前驱结点了,说明不存在合法拓扑排序;
37             {
38                 flag = 0;
39                 break;
40             }
41         }
42         if(flag)
43             printf("YES
");
44         else printf("NO
");
45     }
46     return 0;
47 }
View Code
原文地址:https://www.cnblogs.com/LK1994/p/3162490.html