题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4505 Accepted Submission(s):
1282
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 using namespace std; 8 #define maxx 30010 9 vector <int > vec[maxx]; 10 priority_queue <int > q; //优先队列 11 int num[maxx],in[maxx]; 12 int main () 13 { 14 int t,u,v,m,n,i,j; 15 scanf("%d",&t); 16 while (t --) 17 { 18 scanf("%d%d",&n,&m); 19 for (i = 1; i <= n; i ++) //清空容器内的数据 20 vec[i].clear(); 21 memset(in,0,sizeof(in)); //入度初始化为0 22 23 for (i = 0; i < m; i ++) 24 { 25 scanf("%d%d",&u,&v); 26 in[u] ++; 27 vec[v].push_back(u); 28 } 29 for (i = 1; i <= n; i ++) //将入度为0的点加入优先队列 30 if (in[i]==0) q.push(i); 31 32 j = 0; 33 while(!q.empty()) 34 { 35 int k = q.top(); 36 q.pop(); 37 num[j ++] = k; 38 int len = vec[k].size(); 39 for (i = 0; i < len; i ++) // 删除与度数为0的节点相关联的边 40 { 41 int l = vec[k][i]; 42 in[l] --; 43 if (in[l]==0) 44 q.push(l); 45 } 46 } 47 for (i = j-1; i >= 0; i --) 48 { 49 if (i==0) 50 printf("%d",num[i]); 51 else 52 printf("%d ",num[i]); 53 } 54 printf("\n"); 55 } 56 return 0; 57 }
原文:http://www.cnblogs.com/yoke/p/6080304.html