拓扑排序

一.定义

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

通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

注意:

1)只有有向无环图才存在拓扑序列;

2)对于一个DAG,可能存在多个拓扑序列(此题已经规定了数字的优先级,所以答案唯一);

二.拓扑序列算法思想

(1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;

 

(2)从有向图中删去此顶点以及所有以它为尾的弧;

     重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include<functional>
#define MAXSIZE 100005
using namespace std; vector<int>G[MAXSIZE];
priority_queue<int ,vector<int>, less<int> > q;
int in[MAXSIZE]; int main()
{
int T,n,m,a,b;
scanf("%d",&T);
while(T--)
{
memset(in,,sizeof(in));
vector<int> ans;
for(int i=;i<MAXSIZE;i++)
G[i].clear();
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&a,&b);
in[a]++;
G[b].push_back(a);
}
for(int i=;i<=n;i++)
if(!in[i]) q.push(i);
while(!q.empty())
{
int u=q.top();
ans.push_back(u);
q.pop();
int len=G[u].size();
for(int i=;i<len;i++)
{
int v=G[u][i];
in[v]--;
if(!in[v])
q.push(v);
} }
int len=ans.size();
for(int i=len-;i>=;i--)
printf("%d%c",ans[i],i==?'\n':' ');
}
return ;
}

HDU 4857 逃生(拓扑排序)的更多相关文章

  1. hdu 4857 逃生 拓扑排序+PQ,剥层分析

    pid=4857">hdu4857 逃生 题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面. 一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点) ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. hdu 4857 逃生

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

随机推荐

  1. scrapy关键字爬取百度图库(一)

    刚入门学习python的菜鸟,如有错误,还望指教 爬取百度图库需要知道百度图库的加载方式是通过下拉加载的,所以我们需要分析Ajax请求来爬取每一页的数据信息 表述不清直接上图片 图片一是刷新页面后加载 ...

  2. Windows下MySQL下载安装、配置与使用

    用过MySQL之后,不论容量的话,发现比其他两个(sql server .oracle)好用的多,一下子就喜欢上了.下面给那些还不知道怎么弄的童鞋们写下具体的方法步骤. (我这个写得有点太详细了,甚至 ...

  3. emacs简易配置

    (setq-default inhibit-startup-message t tab-width 4 c-basic-offset 4 indent-tabs-mode t) (tool-bar-m ...

  4. IE缓存查看的方法

    选择设置中的Internet选项中, 然后点击查看文件: 最终缓存目录:

  5. CodeForces1065F 树形dp

    http://codeforces.com/problemset/problem/1065/F 你有一棵带有n个结点的树,根是结点1.有一个标记,最初在根结点处.你可以将标记移动到其他结点处.假设标记 ...

  6. MySQL_函数(待续)

    1.REPLACE(str,from_str,to_str) 定义:REPLACE(str,from_str,to_str) 解释:返回值是把字符串str 中的子串from_str 全部替换为to_s ...

  7. C#设计模式(12)——组合模式

    1.组合模式 在软件开发中我们经常会遇到处理部分与整体的情况,如我们经常见到的树形菜单,一个菜单项的子节点可以指向具体的内容,也可以是子菜单.类似的情况还有文件夹,文件夹的下级可以是文件夹也可以是文件 ...

  8. 解决pycharm启动慢

    xms -xmx相关参数设置 打开pycharm的安装目录 D:\PyCharm\PyCharm 2018.2.3\bin下文件pycharm.exe.vmoptions修改默认(版本2016.2)的 ...

  9. python -- leetcode 刷题之路

    第一题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], tar ...

  10. 029、限制容器的block IO(2019-01-24 周四)

    参考https://www.cnblogs.com/CloudMan6/p/7016050.html   Block IO ,是另一种可以限制容器使用的资源,block IO 指的是磁盘的读写,doc ...