HDU-3342-Legal or Not
Posted ydddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-3342-Legal or Not相关的知识,希望对你有一定的参考价值。
链接:https://vjudge.net/problem/HDU-3342
题意:
给出一个有向图,判断是否有环,也就是问是否是有向无环图(DAG),是则输出YES,否则输出NO,所以可以用是否存在拓扑序列来判断。
思路:
拓扑排序。记录所有出度为0的点,找出拓扑序,若拓扑序数组的大小不等于n,则存在环。
代码:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> #include <queue> using namespace std; typedef long long LL; const int MAXN = 500 + 10; vector<int> Group[MAXN]; int in[MAXN]; int n, m; bool topo() { vector<int> res; priority_queue<int> que; for (int i = 0; i <= n - 1;i++) if (in[i] == 0) que.push(-i); while (!que.empty()) { int now = -que.top(); que.pop(); res.push_back(now); for (auto x : Group[now]) if (--in[x] == 0) que.push(-x); } if (res.size() != n) return false; else return true; } int main() { int l, r; while (scanf("%d%d", &n, &m) && n) { for (int i = 0;i <= n - 1;i++) Group[i].clear(); memset(in, 0, sizeof(in)); for (int i = 1; i <= m; i++) { scanf("%d%d", &l, &r); Group[l].push_back(r); in[r]++; } if (topo()) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
以上是关于HDU-3342-Legal or Not的主要内容,如果未能解决你的问题,请参考以下文章