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

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

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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

Hint

Source

赵利强

// 拓扑排序条件
// 有向图 无环
#include
using namespace std;
int gra[11][11];
int vis[11], du[11];
int n, m;
bool topSort() {
    int flag;
    // 依次访问寻找n个节点
    for (int i = 1; i <= n; i++) {
        flag = 0;
        // 每次查找最先被找到的(未标记) 但入度为0的点
        for (int j = 1; j <= n; j++) {
            if (!du[j] && !vis[j]) {
                vis[j] = 1;
                for (int k = 1; k <= n; k++) {
                    if (gra[j][k]) du[k]--;
                }
                flag = 1;
                break;
            }
        }
        // 当出现环的时候 即无法找到入度为0的点的
        if (!flag) break;
    }
    return (flag == 1);
}
int main() {
    int u, v;
    while (cin >> n >> m) {
        memset(gra, 0, sizeof(gra));
        memset(vis, 0, sizeof(vis));
        memset(du, 0, sizeof(du));
        for (int i = 0; i < m; i++) {
            cin >> u >> v;
            gra[u][v] = 1;
            du[v]++;
        }
        if (topSort())
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

 

你可能感兴趣的:(《数据结构》图论)