传递 hdu 5961 拓扑排序有无环~

Posted 林兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传递 hdu 5961 拓扑排序有无环~相关的知识,希望对你有一定的参考价值。

 

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961

题目为中文,这里就不描述题意了。

思路:

从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分为两个图P、Q,但是它们是有内在联系的,即:P+Q,抛去方向即为完全图。

题目都是中文,这里就不翻译了。我们可以从题目中知道,如果P、Q均满足传递性,那么P与(Q的反向图)生成的有向图应该无环。

所以,简单一个拓扑排序检查是否有环即可,P、Q合为一张图,跑一遍,这个还是很快的。

时长:3432MS

代码如下:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <queue>
 4 #include <vector>
 5 using namespace std;
 6 vector<int> edge[2017];
 7 queue<int> Q;
 8 int m, n, inDegree[2017];
 9 
10 int main() 
11 {
12     scanf("%d\n", &n);
13     while (n--)
14     {
15         scanf("%d\n", &m);
16         memset(inDegree, 0, sizeof inDegree);
17         for (int i = 1; i<=m; i++)     edge[i].clear();
18         while (!Q.empty())     Q.pop();
19 
20         for (int i = 1; i <= m; ++i)
21             for (int j = 1; j <= m; ++j)
22             {
23                 char ch; 
24                 cin >> ch;
25                 if (ch == P)
26                     inDegree[j]++, edge[i].push_back(j);
27                 if (ch == Q)
28                     inDegree[i]++, edge[j].push_back(i);
29             }
30         for (int i = 1; i<=m; i++) 
31             if (!inDegree[i]) 
32                 Q.push(i);
33         int cnt = 0, newP;
34         while (!Q.empty()) {
35             newP = Q.front(), Q.pop();
36             cnt++;
37             for (int i = 0; i<edge[newP].size(); i++) {
38                 inDegree[edge[newP][i]]--;
39                 if (inDegree[edge[newP][i]] == 0) 
40                     Q.push(edge[newP][i]);
41             }
42         }
43         if (cnt == m) printf("T\n");
44         else printf("N\n");
45     }
46 }

 

感谢您的阅读,生活愉快~

以上是关于传递 hdu 5961 拓扑排序有无环~的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5961 传递 图论+拓扑 (中国大学生程序设计竞赛(合肥))

HDU 5961 传递

HDU - 4324 Triangle LOVE(拓扑排序)

HDU 5961 传递

HDU 5961:传递(暴搜)

HDU5961 传递(判环)