C - Book 拓扑排序

谁践踏了优雅 2022-08-28 12:43 337阅读 0赞

https://codeforces.com/contest/1573/problem/C

判断还有度的节点一定放在最后
注意更新的操作:如果比当前节点小,当前节点加一再比较,否则直接比较
最后输出最大的操作次数就可以。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 2e5 + 10;
  4. vector<int> to[N];
  5. int main() {
  6. ios::sync_with_stdio(false); cin.tie(0);
  7. int t; cin >> t;
  8. while (t--) {
  9. int n; cin >> n;
  10. for (int i = 0; i < n; i++) to[i].clear();
  11. vector<int> in(n);
  12. for (int i = 0; i < n; i++) {
  13. int x; cin >> x;
  14. for (int j = 0; j < x; j++) {
  15. int k; cin >> k;
  16. k--;
  17. to[k].push_back(i); // 邻接表,存下一个节点
  18. in[i]++;
  19. }
  20. }
  21. queue<int> q;
  22. vector<int> ts(n);
  23. for (int i = 0; i < n; i++) {
  24. if (in[i] == 0) {
  25. q.push(i); // 存入度为0的点
  26. ts[i] = 1;
  27. }
  28. }
  29. while (!q.empty()) {
  30. int u = q.front(); q.pop();
  31. for (auto v : to[u]) { // 入度为0的下一个节点
  32. in[v]--; // 入度减少一
  33. if (v < u) ts[v] = max(ts[v], ts[u] + 1);
  34. // 如果 下一个更新的节点比当前节点小,当前节点要多更新一次,才会更新到下一个节点
  35. else ts[v] = max(ts[v], ts[u]);
  36. // 待更新的节点 比 当前节点大,那么只需要比较跟新的次数
  37. if (!in[v])q.push(v);
  38. }
  39. }
  40. int ok = 1;
  41. for(int i = 0; i < n; i++)
  42. if(in[i]) { ok = 0; break;}
  43. if(!ok) { cout << "-1\n"; continue; }
  44. cout << *max_element(ts.begin(),ts.end()) << '\n';
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,337人围观)

还没有评论,来说两句吧...

相关阅读

    相关 拓扑排序C语言详解

    1. 拓扑排序是对有向无环图的操作。 2. 如果有环,则会出现,没有入度为0的点的情况,如图。任务之间相互等待。 ![在这里插入图片描述][202003281213383

    相关 拓扑排序C语言)

    在一个有向无环图中,用顶点表示活动,用弧表示活动间的优先关系的有向无环图,称为顶点表示活动的网,简称AOV-网。 对AOV-网,可用拓扑排序来得到他们顶点数据的优先关系,即拓

    相关 C++ 拓扑排序算法

    拓扑排序 有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图。 拓扑排序 拓扑排序是将有向无环图G的

    相关 拓扑排序

    什么是拓扑排序? 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序

    相关 拓扑排序

    拓 扑 排 序 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就

    相关 拓扑排序

    拓扑排序: 拓扑排序是根据离散数学中有关偏序与全序定义的。 ![0_1314168765l7fq.gif][] 若一个集合 X 上的关系 R 是自反的 反

    相关 拓扑排序

     一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程