数据结构实验之图论十:判断给定图是否存在合法拓扑序列

来源:互联网 发布:知乎最高赞用户 编辑:程序博客网 时间:2024/05/16 03:56

数据结构实验之图论十:判断给定图是否存在合法拓扑序列
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
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 vt[MAX];//标记当前点是否走过,没走为0走了为1int 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(vt, 0, sizeof(vt));        memset(degree, 0, sizeof(degree));        for (i = 0; i < e; i++)        {            cin >> va >> vb;            mmp[va][vb] = 1;            degree[vb]++;        }        for (i = 0; i < e; i++)//遍历e次        {            flag = 0;             for (j = 1; j <= e; j++)//找出本次的开始            {                if (!vt[j] && degree[j] == 0)//存在开始,开始度数为0                {                    for (k = 1; k <= e; k++)                    {                        if (mmp[j][k])                        {                            degree[k]--;//把和当前点连接的线都去掉                        }                    }                    vt[j] = 1;//当前点访问过了                    flag = 1;//标记本次遍历存在开始                    break;                }            }            if (flag == 0)            {                break;            }        }        if (flag)            cout << "YES" << endl;        else cout << "NO" << endl;    }    return 0;}
阅读全文
0 0