逃生(HDU4857 + 反向拓扑排序)
2024-08-29 18:05:09
题目链接: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 ;
}
最新文章
- 2MyBatis入门--深入浅出MyBatis技术原理与实践(笔记)
- NCreport报表控件教程:设计页眉和页脚
- Windows 下安装cryptography-1.6
- 谈谈我的编程之路---WAMP(三)
- Python一行代码
- uiimageView连续帧动画
- 【笔记-前端】div+css排版基础,以及错误记录
- if form1.showmodal:=mrok then 什么意思
- HTML5音频
- C++函数声明和定义深度解析
- NodeJS Stream 二:什么是 Stream
- boolean attribute(布尔值属性) attribute vs property
- Java. Warning – Build path specifies execution environment J2SE-1.5
- 【php】php分隔字符串为数组
- 【shell】两种字符串提取场景的实现
- kafka其中一台节点坏掉的迁移或者数据迁移
- UVALive - 4885 Task 差分约束
- 关于Java实现的进制转化(位运算)
- redis 的简单用法
- Mac上安装Git
热门文章
- iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?
- iOS开发跳转指定页面
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
- Java-编译后出现$1.class、$2.class等多个class文件
- Thinkphp5的ajax接口实现
- docker使用记录
- HUAS 1482 lsy的后宫(DP+矩阵快速幂)
- 判断form表单每个input字段是否有内容
- 【原创】宿主机远程登录虚拟机(windows server 2003系统)
- 【以前的空间】link cut tree