两个很经典的拓扑排序题目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(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...
随机推荐
- 使用javascript模拟常见数据结构(三)
六.字典和散列表 我们已经知道,集合表示一组互不相同的元素(不重复元素).在字典中,存储的是键值对,其中键值是用来查询特定的元素的.字典和集合是很相似的,集合采用[值,值]的方式存储,而字典则是以[键 ...
- zoj Candies 思维
http://acm.zju.edu.cn/changsha/showProblem.do?problemId=31 题意: 给你n个非负整数,然后输入n个x[i],x[i] == -1表示第i个数不 ...
- python 随机选择字符串中的一个字符
import random print(random.choice('abcdefghijklm'))
- Qt570_CentOS64x64_01
ZC: 其实 主要是要安装 OpenGL,具体看"3"... ... 1.运行 "/opt/Qt5.7.0/Tools/QtCreator/bin/qtcreator&q ...
- postgresql中终止正在执行的SQL语句
在Linux系统中可以使用kill [pid]的方式强制删除进程,但对于修改数据表的语句来说,这样可能导致postgresql进入recovery mode,这样会导致锁表. Postgresql的运 ...
- Linux命令详解-type
type命令用来显示指定命令的类型. 一个命令的类型可以是如下之一 alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 ...
- 部署到VM的虚拟机提示“未连接到网络”
以下可以看到网络图标为叉叉
- laravel中数据库迁移的使用:
创建数据库迁移文件: php artisan make:migration create_links_table 创建完表之后,设置字段: public function up() { Schema: ...
- LINQ 分页 和存储过程分页
存储过程分页 SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY CreateDate DESC) AS RowNo, EstateAddress, E ...
- 谈谈我对"闭包"的理解
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作 ...