图结构练习——判断给定图是否存在合法拓扑序列

来源:互联网 发布:mac开机什么都没有 编辑:程序博客网 时间:2024/06/06 03:50

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;bool Map[105][105];int dis[105];void sorttp();int n, m;int main(){    while(cin >> n >> m)    {        memset(Map, 0, sizeof(Map));        memset(dis, 0, sizeof(dis));        while(m --)        {            int x, y;            cin >> x >>y;            Map[x][y] = 1;            dis[y] ++;        }        sorttp();    }}void sorttp(){    int i, j, k;    int flag = 0  ;    for (i = 1; i <= n; i ++)    {        flag = 0;        for (j = 1; j <= n; j ++)        {            if (dis[j] == 0)            {                flag = 1;                dis[j] = -1;                for (k = 1; k <= n; k ++)                {                    if (Map[j][k])                    {                        dis[k] --;                    }                }                break;            }        }        if (flag == 0)            break;    }    if (flag == 1)        cout << "YES" << endl;    else        cout << "NO" << endl;}
阅读全文
0 0