hdu 4857 逃生 拓扑排序+PQ,剥层分析
题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面。
一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点)。然后用拓扑排序+优先对列正向处理,正向输出。这是错误的。例如以下例子:
1
5 4
5 2
4 3
2 1
3 1
正确的解法:是反向建边。点大的优先级高,用拓扑排序+优先队列,逆向输出序列就可以。
依据每对限制,可确定拓扑序列,但此时的拓扑序列可能有多个(没有之间关系的点的顺序不定)。本题要求较小的点排到前面。则可确定序列。
(1)假设点a和点b有直接和简接的拓扑关系,那么a和b的先后顺序可有拓扑排序确定。
(2)假设点a和点b没有直接和简接的拓扑关系,那么a和b的先后顺序由a和b所能到达的点的确定。
如:
1
3 2
3 1
3 1
应输出结果为 3 1 2
点3 和 点2 没有直接的拓扑关系,可是3到达最小点为1,2到达最小点为2。
综合(1)和(2)本题须要逆向处理。
PS:欧拉回路的路径输出也是逆向输出的。
#include <bits\stdc++.h>
using namespace std; typedef long long LL;
const int INF = 1000000007;
const double eps = 1e-10;
const int maxn = 30010; int d[maxn];
vector<int>v[maxn];
priority_queue<int, vector<int>, less<int> > q;
int n, m;
int main ()
{
int T;
cin >> T;
while (T--)
{
scanf("%d%d", &n, &m);
memset(d, 0, sizeof(d));
for (int i = 0; i <= n; i++) v[i].clear();
for (int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
v[y].push_back(x);
d[x]++;
}
for (int i = 1; i <= n; i++)
if (!d[i]) q.push(i);
stack<int>sk;
while (!q.empty())
{
int x = q.top(); q.pop();
sk.push(x);
for (int i = 0; i < v[x].size(); i++)
{
int y = v[x][i]; d[y]--;
if (!d[y])
{
q.push(y);
}
}
}
int fir = 1;
while (!sk.empty())
{
if (!fir) printf(" "); fir = 0;
printf("%d", sk.top()); sk.pop();
}
puts("");
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
hdu 4857 逃生 拓扑排序+PQ,剥层分析的更多相关文章
- hdu 4857 逃生 拓扑排序+逆向建图
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...
- hdu 4857 逆向拓扑排序+反向输出
/*一组测试实例 4 4 2 3 1 2 4 */ #include<stdio.h> #include<string.h> #include<queue> usi ...
- HDU.2647 Reward(拓扑排序 TopSort)
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)
确定比赛名次 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- HDU 4857 逃生(反向建边的拓扑排序+贪心思想)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- HDU 4857 逃生(拓扑排序)
拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...
- hdu 4857 逃生
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...
随机推荐
- asp.net mvc 导出表格
适合使用的场合: .net 中从前台中的table导出成excel文件,兼容各种浏览器. 使用工具: org.in2bits.MyXls.dll 从前台获取表格的thead和表格的tbody,将其转化 ...
- 14.5.5 Creating a File-Per-Table Tablespace Outside the Data Directory
14.5.5 Creating a File-Per-Table Tablespace Outside the Data Directory 创建一个File-Per-Table Tablespace ...
- 修改注册表添加IE信任站点及启用Activex控件
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/In ...
- 如何在github中贡献自己的力量
如何参与github的开源项目? 1.找一个发出“pull requests”的项目.有以下几个方法:最简单的方式是,读项目的readme文件.它会告诉你,项目的拥有者是否急切的需要协助.如果read ...
- Jetty:配置安全
用${jetty.home}和${jetty.base}配置安全 Jetty 9.1中: 1)${jetty.home}是jetty公布(二进制)的文件夹路径: 2)${jetty.base}是用 ...
- Contact类解析
Contact类 public static class Contacts implements BaseColumns, ContactsColumns, ContactOptionsColumns ...
- 单例模式(Singleton)Holder
public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...
- [Android]图片资源管理学习
一.概念 几个概念:1.像素:像素是组成图像的最基本单位:点该点自身有大小,其中保存了颜色值 2.屏幕尺寸:screen size手机屏幕的物理尺寸.单位:inch(英寸)ex:4.0英寸 3.8英寸 ...
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
我们维护两个指针, 它们之间的距离为n. 然后.我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变. 那么, 当第二个指针指到空时.第一个指针即为所求. #include <ios ...
- C++ Primer中文版(第5版)
<C++ Primer中文版(第5版)> 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼) Josee Lajoie(约瑟 拉乔伊) Barbar ...