数据结构实验之图论十:判断给定图是否存在合法拓扑序列
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 <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 11;
int mp[maxn][maxn];
int du[maxn];
int vis[maxn];
void topol(int n)
{
int num = 0;
queue<int>q;
for(int i = 1; i <= n; i++)
{
if(du[i] == 0)
{
q.push(i);
vis[i]=1;
num++;
}
}
while(!q.empty())
{
int now = q.front();
q.pop();
for(int i = 1; i <= n; i++)
{
if(mp[now][i] && !vis[i])
{
du[i]--;
if(du[i] == 0)
{
q.push(i);
vis[i]=1;
num++;
}
}
}
}
if(num == n)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
memset(du, 0, sizeof(du));
memset(mp, 0, sizeof(mp));
memset(vis, 0, sizeof(vis));
while(m--)
{
int u,v;
scanf("%d%d", &u, &v);
du[v]++;
mp[u][v] = 1;
}
topol(n);
}
return 0;
}