题目: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 }
感谢您的阅读,生活愉快~