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. MySQL 创建函数(Function)

    目标 怎么样MySQL创建数据库功能(Function) 语法 CREATE FUNCTION func_name ( [func_parameter] ) //括号是必须的,參数是可选的 RETUR ...

  2. Aerospike | Aerospike Chinese

    Aerospike | Aerospike Chinese 如果您的企业依赖于: 庞大的数据量(超过任何结构化数据库所能处理的数据量) 可预见(且快速)的性能 透明的扩展 始终正常运行 那么您只有一个 ...

  3. Delphi的类型转换 good

    Delphi是一种强类型转换的语言.在VC中,赋值符用″=″,例如x=1;到了Delphi赋值符就变成了″:=″,例如x:=1. 从赋值时用符号″:=″而不用″=″,就隐约可见Delphi对类型匹配要 ...

  4. 自学PHP 环境搭建

    自学PHP之环境搭建 一..首先 安装 phpStudy2013.exe 程序集成包  安装完可能端口被占用 需要手动设置 然后打开http://localhost:8080/phpMyAdmin/ ...

  5. linux文件夹介绍

    (1)documentation 这个文件夹下没有内核代码,仅仅有一套实用的文档,但这些文档的质量不一.比如内核文档的文件系统,在该文件夹下有相当优秀并且相当完整的文档:而另外一部分内核,比如进程调度 ...

  6. form不提交问题

    var confirmOrderForm=document.getElementById("confirmOrderForm"); var url="${pageCont ...

  7. ThinkPHP配置项(六)

    原文:ThinkPHP配置项(六) 配置项--这只是部分的配置,后期会随时跟大家更新分享 1:修改URL分隔符 目录:thinkphp\Home\Conf\config.php打开配置文件代码中加上: ...

  8. Java 建立mysql数据库连接的语句

    每次在面试时被问到jdbc的数据路链接过程都卡着,这次不怕了,背会了... 第一个,比较粗糙的 try{   Class.forName("com.mysql.jdbc.Driver&quo ...

  9. 图解:如何U盘装Win7系统(傻瓜式装机) + 分区步骤图解(用WIN7自带管理工具)

    原地址:http://wenku.baidu.com/link?url=wV2Pfw2IM21u2KmtAcNweSZRwpXRuKAVAS29dS4aWGEpMtFdDlzZvixCgsvBxIm- ...

  10. String、StringBuffer与StringBuilder差分

    的位置不言而喻.那么他们究竟有什么优缺点,究竟什么时候该用谁呢?以下我们从以下几点说明一下 1.三者在运行速度方面的比較:StringBuilder >  StringBuffer  >  ...