两个很经典的拓扑排序题目POJ3687+HDU1285
一、题目链接
POJ:http://poj.org/problem?id=3687
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1285
二、思路
这两题题意非常相似,但是,做法却十分不同。不同的地方是,POJ题目要求按编号顺序输出排名,在答案不唯一的情况下,编号小的排名尽量靠前(即编号的更小的结点的排名优先输出);HDU题目要求按排名顺序输出编号,在答案不唯一的情况下(排名相同的情况下),编号小的尽量靠前。这两个不同的输出感觉是一个意思。但是,做法却不相同。实际上,这两题的共同点就是,在答案不唯一的情况下,输出字典序最小的。
做法上,POJ题目是反向建边+编号大根堆。优先取入度为0的编号大的点,以保证编号小的顶点排名尽可能小。而HDU是正向建边+编号小根堆。
三、注意事项
输入时,写成
while(~scanf("%d%d", &n, &m))//即while(scanf("%d%d", &n, &m) != EOF)
这样写,就要记得做初始化(容器clear, pop, 数组memset)操作,但是保险。但是,也不是绝对的。如果发生超时的时候,可尝试修改这个地方为如下代码,以节省初始化产生的耗时(因为数组、容器什么的一般都写成全局变量):
scanf("%d%d", &n, &m); //只读一个样例
四、源代码
POJ3687
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m;
vector<];
priority_queue<int> que;
], deg[];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif // ONLINE_JUDGE
int T, a, b;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
memset(deg, , sizeof(deg));
; i <= n; ++i)G[i].clear();
while(!que.empty())que.pop();
; j <= m; ++j) {
scanf("%d%d", &a, &b);
if(find(G[b].begin(), G[b].end(), a) == G[b].end()) {
G[b].push_back(a);
deg[a]++;
}
}
; i <= n; ++i) {
)que.push(i);
}
int idx = n;
while(!que.empty()) {
int top = que.top();
que.pop();
ans[top] = idx--;
; i < G[top].size(); ++i) {
int to = G[top][i];
deg[to]--;
)que.push(to);
}
}
)puts("-1");
; i <= n; ++i)
printf("%d%c", ans[i], i == n ? '\n' : ' ');
}
;
}
HDU1285
#include<bits/stdc++.h>
using namespace std;
];
vector<], ans;
priority_queue<int, vector<int>, greater<int> > que;
int main() {
int a, b;
while(~scanf("%d%d", &n, &m)) {
memset(deg, , sizeof(deg));
; i < ; ++i)G[i].clear();
while(!que.empty())que.pop();
ans.clear();
; i <= m; ++i) {
scanf("%d%d", &a, &b);
if(find(G[a].begin(), G[a].end(), b) == G[a].end()) {
G[a].push_back(b);
deg[b]++;
}
}
; i <= n; ++i) {
)que.push(i);
}
while(!que.empty()) {
int top = que.top();
que.pop();
ans.push_back(top);
; i < G[top].size(); ++i) {
int to = G[top][i];
deg[to]--;
)que.push(to);
}
}
;i < ans.size();++i)printf( ? '\n':' ');
}
;
}
两个很经典的拓扑排序题目POJ3687+HDU1285的更多相关文章
- 经典问题----拓扑排序(HDU2647)
题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...
- ACM/ICPC 之 拓扑排序-反向(POJ3687)
难点依旧是题意....需要反向构图+去重+看题 POJ3687-Labeling Balls 题意:1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号最小的Ball重 ...
- Frame Stacking(拓扑排序)
题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076. Frame Stacking Time Limit: 1.0 Seconds Memory ...
- 【拓扑排序】威虎山上的分配-C++
威虎山上的分配 描述 每年过年的时候,座山雕都会给兄弟们分银子,分银子之前,座山雕允许大伙儿发表意见,因为要是没法满足所有人的意见,指不定谁要搞出什么大新闻.不过每个人在提意见的时候只能说:" ...
- Codeforces Gym-102219 2019 ICPC Malaysia National J. Kitchen Plates (暴力,拓扑排序)
题意:给你5个\(A,B,C,D,E\)大小关系式,升序输出它们,如果所给的大小矛盾,输出\(impossible\). 题意:当时第一眼想到的就是连边然后排序,很明显是拓扑排序(然而我不会qwq,之 ...
- Queue 应用——拓扑排序
1. 拓扑排序 题目描述:对一个有向无环图(Directed Acyclic Graph, DAG)G进行拓扑排序,是将G中所有顶点排成线性序列,是的图中任意一堆顶点u和v,若边(u, v)在E(G) ...
- UVa 10305 (拓扑排序) Ordering Tasks
题意: 经典的拓扑排序.有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列. 分析: 拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系.我们将“小于”这种关系看做一条有向 ...
- 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)
[BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...
- 【noip模拟赛4】找啊找啊找BF 拓扑排序
描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...
随机推荐
- 16s workfollw
http://bioconductor.org/packages/devel/bioc/vignettes/metagenomeFeatures/inst/doc/Example_16S_Annota ...
- platforms
1.Qt551x86_vs2013 所有的 platforms文件夹 的路径: 1.1.E:\ZC_ProgramFiles_161104\Qt551_vs2013\5.5\msvc2013\plug ...
- JAVA异常处理分析高级进界(下)
既然Throwable是异常处理机制的核心,那么,我们就来分析下它的源码来看看它是如何实现的. 进行分析前,我们可以先想想如果让我们实现一个异常处理机制,我们需要它做什么? 1. 发生异常终止程序执行 ...
- JSP 指令
JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %&g ...
- erlang 一个高性能web框架 Cowboy 的使用笔记
环境:ubuntu_server 1210 目的:构建web版hello world程序 参考链接:http://roberto-aloi.com/blog/2013/07/13/create-dep ...
- 关闭定时器(setTimeout/clearTimeout|setInterval/clearInterval)
1.1 开启Timeout程序: scope.setTimeout("functionName()" | functionHandle, timeValue) 返回值:timerI ...
- 【hive】数据仓库层次设计
转载 https://www.jianshu.com/p/849db358ec61
- PostgresException: 42883: function ifnull(integer, integer) does not exist
原因在于PostGresql并没有自带IFNULL函数,可以用COALESCE来替代IFNULL,且COALESCE功能更强大,可以输入更多参数,顺序判断并返回第一个非null值. 例如: SELEC ...
- 升级安装windows8.1以后windowsphone8不能启动虚拟机的办法
如果之前在的虚拟机是OK的话,VS2012需要安装update3补丁才可以. 下载地址:http://download.microsoft.com/download/D/4/8/D48D1AC2-A2 ...
- ISE创建Microblaze软核(三)
第七步 进入SDK开发环境 编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录. 进入SDK主界面. ...