标签:span blog 拓扑 tac color 拓扑排序 log ons ace
骚题。嗯,是的。
这题读题面就可以看出是拓扑排序。本来以为是裸题,结果发现要priority_queue处理,然后发现不行。然后懵逼。
其实正解是反向建图日神仙。然后扔在pq里头,然后拓扑序,然后反向输出。注意有Impossible所以不能边处理边输出。
额。。。然后调了TM半个小时。。。
发现自己在处理的时候往ans中重复加了点,一直输出Impossible。。。绝望脸。。。
最后,才发现pq居然没有clear()!没有clear()!没有clear()!竟有如此厚颜无耻之STL!
好吧,上代码,保留调试痕迹。
1 #include<cstdio> 2 #include<queue> 3 #include<stack> 4 5 using namespace std; 6 7 const int SIZE = 100000 + 10; 8 9 vector<int> G[SIZE]; 10 priority_queue<int> q; 11 stack<int> ans; 12 13 int in[SIZE]; //入度 14 15 int main() { 16 int T; 17 scanf("%d", &T); 18 while(T--) { 19 int n, m; 20 scanf("%d%d", &n, &m); 21 for(int i = 0; i < m; i++) { 22 int f, t; 23 scanf("%d%d", &f, &t); 24 G[t].push_back(f); 25 in[f]++; 26 } 27 for(int i = 1; i <= n; i++){ 28 if(!in[i]){ 29 q.push(i); 30 // printf("push = %d\n", i); 31 } 32 } 33 while(!q.empty()) { 34 int t = q.top(); 35 q.pop(); 36 // printf("top = %d\n", t); 37 ans.push(t); 38 for(int i = 0; i < G[t].size(); i++) { 39 in[G[t][i]]--; 40 if(!in[G[t][i]]) { 41 q.push(G[t][i]); 42 // printf("push = %d\n", G[t][i]); 43 } 44 } 45 } 46 // printf("ans.size() = %d\n", ans.size()); ----> 一切绝望的根源 X) 47 if(ans.size() != n){ 48 printf("Impossible!\n"); 49 while(!q.empty()){ 50 q.pop(); 51 } 52 }else{ 53 while(!ans.empty()){ 54 printf("%d ",ans.top()); 55 ans.pop(); 56 } 57 printf("\n"); 58 } 59 for(int i = 0; i <= n; i++){ 60 G[i].clear(); 61 in[i] = 0; 62 } 63 } 64 return 0; 65 }
标签:span blog 拓扑 tac color 拓扑排序 log ons ace
原文地址:http://www.cnblogs.com/codeiscode/p/7756889.html