1. 程式人生 > >傳遞 hdu 5961 拓撲排序有無環~

傳遞 hdu 5961 拓撲排序有無環~

name nbsp ems print str using body new eof

題目: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 拓撲排序有無環~