数据结构实验之图论十:判断给定图是否存在合法拓扑序列
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Example Input
1 0 2 2 1 2 2 1
Example Output
YES NO
#include <bits/stdc++.h>
using namespace std;
int a[1100][1100], vis[1100], du[1100];
int m, n;
void tupu()
{
int flag;
for(int i = 1; i <= n; i++)//寻找n次,每次都找一个度为0切没有被访问过的节点依次寻找。
{
flag = 0;
for(int j = 1; j <= n; j++)//节点从1到n依次遍历寻找。
{
if(vis[j] == 0 && du[j] == 0)//找到一个度为0的节点,且没有被访问过。
{
vis[j] = 1;//将此节点标志位1.
for(int k = 1; k <= n; k++)//以此节点为起点的弧去掉。
{
if(a[j][k] == 1)
{
du[k]--;
}
}
flag = 1;
break;//结束这一次查找
}
}
}
if(flag == 1)//若每一次都可以找到度为0的节点则是拓扑排序。
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
int main()
{
int i, j, x;
while(cin >> n >> m)
{
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
memset(du, 0, sizeof(du));
for(x = 0; x < m; x++)
{
cin >> i >> j;
a[i][j] = 1;
du[j]++;
}
tupu();
}
return 0;
}

本文介绍了一个简单的图论实验,通过实现拓扑排序算法来判断给定的有向图是否存在合法的拓扑序列。文章提供了完整的C++代码实现,并详细解释了拓扑排序的过程。
1331

被折叠的 条评论
为什么被折叠?



