题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857

题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列(即输入的u,v,优先级最高),一个是序号从小到大(优先级次之)。正向的话由于这两个条件不好维护,所以就想着用反向拓扑排序来实现。首先记录每个节点的出度,然后用优先队列来维护顺序(使用默认的从大到小排序),最后反向输出即可。

代码实现如下:

 #include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std; const int maxn = 3e4 + ;
int t, n, m, u, v, rk;
int InDeg[maxn], Rank[maxn];
vector<int> G[maxn]; void topsort() {
priority_queue<int> q;
for(int i = ; i <= n; i++) {
if(InDeg[i] == ) q.push(i);
}
int x;
while(!q.empty()) {
x = q.top(), q.pop();
Rank[rk++] = x;
int t = G[x].size();
for(int i = ; i < t; i++) {
if(--InDeg[G[x][i]] == ) q.push(G[x][i]);
}
}
} int main() {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
G[i].clear();
}
memset(InDeg, , sizeof(InDeg));
for(int i = ; i < m; i++) {
scanf("%d%d", &u, &v);
G[v].push_back(u);
InDeg[u]++;
}
rk = ;
topsort();
for(int i = n - ; i >= ; i--) {
if(i != (n - )) {
printf(" ");
}
printf("%d", Rank[i]);
}
printf("\n");
}
return ;
}

最新文章

  1. 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)
  2. NCreport报表控件教程:设计页眉和页脚
  3. Windows 下安装cryptography-1.6
  4. 谈谈我的编程之路---WAMP(三)
  5. Python一行代码
  6. uiimageView连续帧动画
  7. 【笔记-前端】div+css排版基础,以及错误记录
  8. if form1.showmodal:=mrok then 什么意思
  9. HTML5音频
  10. C++函数声明和定义深度解析
  11. NodeJS Stream 二:什么是 Stream
  12. boolean attribute(布尔值属性) attribute vs property
  13. Java. Warning – Build path specifies execution environment J2SE-1.5
  14. 【php】php分隔字符串为数组
  15. 【shell】两种字符串提取场景的实现
  16. kafka其中一台节点坏掉的迁移或者数据迁移
  17. UVALive - 4885 Task 差分约束
  18. 关于Java实现的进制转化(位运算)
  19. redis 的简单用法
  20. Mac上安装Git

热门文章

  1. iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?
  2. iOS开发跳转指定页面
  3. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
  4. Java-编译后出现$1.class、$2.class等多个class文件
  5. Thinkphp5的ajax接口实现
  6. docker使用记录
  7. HUAS 1482 lsy的后宫(DP+矩阵快速幂)
  8. 判断form表单每个input字段是否有内容
  9. 【原创】宿主机远程登录虚拟机(windows server 2003系统)
  10. 【以前的空间】link cut tree