数据结构实验之图论十:判断给定图是否存在合法拓扑序列
Time Limit: 1000 ms Memory Limit: 65536 KiB
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
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
int map[15][15];
int Indegree[1000];
void TopSort(int n)
{
int i,v,cnt = 0;
queue<int>m;
for(i = 1; i <= n; i++) //遍历一遍图中所有顶点,入度为零的就加入队列
{
if(Indegree[i] == 0)
{
m.push(i);
}
}
while(!m.empty()) //当队列不为空的时候,一个一个往外出
{
v = m.front(); //输出v或者记录v的下标
m.pop();
cnt++; //计数,看一共多少个节点
for(i = 1; i <= n; i++)
{
if(map[v][i] == 1) //v的每个相邻的节点i,入度都减1
{
if(--Indegree[i] == 0) //并且如果减完后入度为0就加入队列
m.push(i);
}
}
}
if(cnt == n)printf("YES\n"); //最后判断是不是所有的节点都进过队列
else printf("NO\n"); //否则就是有回路
}
int main()
{
int i, n , m, u, v;
while(~scanf("%d %d",&n,&m))
{
memset(Indegree,0,sizeof(Indegree));
memset(map,0,sizeof(map));
for(i = 1; i <= m; i++)
{
scanf("%d %d",&u,&v);
map[u][v] = 1;
Indegree[v]++; //入度加1
}
TopSort(n);
}
return 0;
}