pid=4857">hdu4857 逃生

题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面。

一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点)。然后用拓扑排序+优先对列正向处理,正向输出。这是错误的。例如以下例子:

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,剥层分析的更多相关文章

  1. hdu 4857 逃生 拓扑排序+逆向建图

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...

  2. hdu 4857 逆向拓扑排序+反向输出

    /*一组测试实例 4 4 2 3 1 2 4 */ #include<stdio.h> #include<string.h> #include<queue> usi ...

  3. HDU.2647 Reward(拓扑排序 TopSort)

    HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...

  4. HDU 4857 逃生 (反向拓扑排序 & 容器实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  5. 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  6. HDU 4857 逃生(反向建边的拓扑排序+贪心思想)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. HDU 4857 逃生 【拓扑排序+反向建图+优先队列】

    逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  8. HDU 4857 逃生(拓扑排序)

    拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...

  9. hdu 4857 逃生

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...

随机推荐

  1. 自定义NavgationBa返回按钮

    iOS  上UINavigationController视图压栈形式,可以在当前视图无限制push许多视图,然而一些会觉得自带的push按钮不够美观,而且当上的上一个页面title很长的时候,那个返回 ...

  2. Android 特殊符号的转码大全

    项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: @号 @ :号 : 空格   以下为常见的ASCII十进制交换编码: --> ...

  3. HDU--杭电--4504--威威猫系列故事——篮球梦--DP

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  4. Spring Security Source Code -- 验证标准流程

    除了初始阶段: 主干验证流程链: MyInvocationSecurityMetadataSource.getAttributes(Object) line: 43     MyFilterSecur ...

  5. Cocos2d-x layout (二)

    相对某个控件进行布局 Size widgetSize = Director::getInstance()->getWinSize(); Text* alert = Text::create(&q ...

  6. Struts2获取演示示例教程

    回想Struts2的使用过程,网上搜的教程多多少少都会有点问题.又一次记录下创建过程,方便查阅. 1.下载Struts2的jar包 下载地址:http://archive.apache.org/dis ...

  7. Microsoft2013校园招聘笔试题及解答

    继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently store the book orders ...

  8. linux下 文件IO 相关

    linux下操作文件或设备,需要一个文件描述符 file descriptor,fd 来引用.fd是一个非负整数,实际上是一个索引值,指向文件的记录表,对文件的操作都需要fd.默认的几个:标准输入流 ...

  9. 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

    程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...

  10. [Android学习笔记]页面布局

    线性布局:LinearLayout 1.集成ViewGroup,故可容纳多个View 2.线性布局,可设置水平或者垂直方向 相对布局:RelativeLayout