数据结构实验之图论十:判断给定图是否存在合法拓扑序列
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
Hint
Author
赵利强
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 150;
int degree[MAX];//当前点的度数
int mmp[MAX][MAX];
int visit[MAX];//标记当前点是否走过,没走为0走了为1
int main()
{
int v, e;
while (cin >> v >> e)
{
if (e == 0)
{
cout << "YES" << endl;
continue;
}
int i, j, k;
int va, vb, flag;
memset(mmp, 0, sizeof(mmp));
memset(visit, 0, sizeof(visit));
memset(degree, 0, sizeof(degree));
for (i = 0; i < e; i++)
{
cin >> va >> vb;
mmp[va][vb] = 1;
degree[vb]++; //count in-degree
}
for (i = 0; i < e; i++)//遍历e次
{
flag = 0;
for (j = 1; j <= e; j++)//找出本次的开始
{
if (!visit[j] && degree[j] == 0)//存在开始,开始度数为0
{
for (k = 1; k <= e; k++)
{
if (mmp[j][k])
{
degree[k]--;//把和当前点连接的线都去掉
}
}
visit[j] = 1;//当前点访问过了
flag = 1;//标记本次遍历存在开始
break;
}
}
if (flag == 0) break;
}
if (flag)
cout << "YES" << endl;
else cout << "NO" << endl;//exist cirle
}
return 0;
}