Problem Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Sample Input
1 0
2 2
1 2
2 1
Sample Output
YES
NO
Hint
Source
赵利强
存在一个合法的拓扑序列要求该图是一个有向无环图,题目给出的即为有向图,所以只需要判断图中是否有环即可。
利用BFS遍历图,若出现一个点遍历两次的情况,则图中有环
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[11][11];
int vis[11];
int vexnum;
void BFS()
{
int temp[11];
int front = 0;
int rear = 0;
int flag = 1;
temp[rear++] = 1;
vis[1] = 1;
while(rear > front)
{
int pos = temp[front++];
for (int i = 1; i <= vexnum; i++)
{
if (map[pos][i])
{
if (vis[i])
{
flag = 0;
break;
}
else
{
temp[rear++] = i;
vis[i] = 1;
}
}
}
}
if (flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
int main()
{
int m;
int u, v;
while(~scanf("%d %d", &vexnum, &m))
{
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
while(m--)
{
scanf("%d %d", &u, &v);
map[u][v] = 1;
}
BFS();
}
return 0;
}