最小拓扑序

topsort.pas/c/cpp

【题目描述】

给一个有向无环图,求其字典序最小的拓扑序。

一个拓扑序被认为字典序{pi}最小当且仅当对于任何其他拓扑序{qi},均存在正整数k,使得对于所有i<k有pi=qi且pk<qk。

【输入】

输入第一行包含两个数n, m分别表示有向无环图的点数和边数。

接下来m行,每行两个数ai, bi,表示图中存在一条ai指向bi的有向边。

【输出】

输出n个数,每个数用空格隔开,表示该图的拓扑序。

【输入样例】

3 1

2 1

【输出样例】

2 1 3

【样例解释】

2, 1, 3

2, 3, 1

3, 2, 1

均为合法拓扑序,但是2, 1, 3为最小字典序的拓扑序。

【数据规模】

50%的数据满足:n<=1000

100%的数据满足:1<=n<=100000, 1<=m<=100000, 1<=ai, bi<=n

保证数据至少存在一种合法的拓扑序列

如果直接枚举与入度为0的点相连的点,时间复杂度就太高了(n*n),所以在进行排序的时候,我们用前向星和优先队列来优化,复杂度是(n+m)

【话说师兄的指针好难看懂……_(:зゝ∠)_】

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;//优先输出小的数的优先队列
int n,m;
int t=0;
int head[100001];
struct node{int to,next;
}e[100001];
int father[100001];//记录入度
void add(int u,int v)
{t++;e[t].to=v;e[t].next=head[u];head[u]=t;
}
void read()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);father[b]++;add(a,b);}for(int i=1;i<=n;i++){if(father[i]==0) {q.push(i);father[i]--;}}
}
void work()
{while(!q.empty()){int p=q.top();    q.pop();        printf("%d ",p);int p1=head[p];while(p1!=0){father[e[p1].to]--;if(father[e[p1].to]==0) q.push(e[p1].to);p1=e[p1].next;}}
}
int main()
{freopen("topsort.in","r",stdin);freopen("topsort.out","w",stdout);read();work();return 0;
}

转载于:https://www.cnblogs.com/orange-/p/4911407.html

【图论训练】最小拓扑序相关推荐

  1. 字典序最小是什么意思_《拓扑序简介》第十六讲

    这是民科+大忽悠+地摊报告,我准备把拓扑序吹成天上有地上无.人见人爱.老幼咸宜.不买会后悔的什么东西.珍惜青春,珍惜钱包,请大家谨慎对待大忽悠.下面是回放视频的链接. 蔻享--共享科学.传播科学​ww ...

  2. 【图论专题】拓扑排序

    拓扑排序 给定一张有向无环图,若一个序列A满足图中的任意一条边(x,y)x都在y的前面呢么序列A就是图的拓扑排序 实际上拓扑排序就是满足所有的边x指向y,x一定在y的前面.这样按照拓扑排序递推,就可以 ...

  3. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  4. 【XSY3325】社保(拓扑序)

    显然我们先缩点,之后转化为一个 DAG,设为 GGG,设由其反边构成的图为 G′G'G′.题意就是求所有 "好的" 点,其中一个 "好的" 点需要满足这个点在 ...

  5. 1396:病毒 (拓扑序)

    [题目描述] 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母.现在怎么恢复原来的文档呢!小y很 ...

  6. #ACW 4084 号码牌(无向图连通性+简单拓扑序)

    1.题意 链接: 原题链接. 给你一个1~n全排列A,让你判断能否通过一种操作使之变为目标排列B.该操作是:交换与当前下标i相距did_idi​的2个元素. 如:下标为5,d5=2d_5=2d5​=2 ...

  7. tarjan+拓扑序+差分--2018.10.16模拟赛T2

    题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...

  8. AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)

    整理的算法模板:ACM算法模板总结(分类详细版) 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航 ...

  9. 图论--DAG与拓扑排序

    拓扑排序概念 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序: 每个顶点出现且只出现一次: 若A 在序列中排在B 的前面,则在图中不存在从B 到 A的路径 ...

最新文章

  1. 设置session失效的几种方法
  2. android log4,GitHub - oronno/log4android: Log4Android - Simple Logging Wrapper Library for Android
  3. nda协议_如何将NDA项目添加到您的投资组合
  4. 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)
  5. LNMP源码安装脚本
  6. 让自己开发的Web应用程序与SharePoint共存
  7. 25 年 IT 老兵零基础写小说,作品堪比《三体》| 人物志
  8. jquery中单选选中及清除选中状态
  9. 十分钟教你使用NoteExpress
  10. Mixgo CE初体验
  11. 2019Thinking(上) -- 一个前端开发者的个人思考
  12. 为什么Java中的float型最大值大于long型?
  13. 如何区分PCA PCoA NMDS LDA t-SNE?
  14. 磨金石学院来报道,电影剪辑有哪些技巧呢?如何让你的剪辑片段更为精彩。
  15. 【代码超详解】LightOJ 1197 Help Hanzo(区间质数筛法)
  16. 透明质酸(玻尿酸)ELISA试剂盒解决方案
  17. 喜茶奶茶技术培训哪里学?
  18. 谷歌公布云游戏平台「Stadia」 预计2019年上线
  19. 读书笔记:《探索大脑的内部世界》
  20. 超微服务器硬盘红灯_服务器硬盘亮红灯崩溃怎么办?数据丢失都是怎么找回的...

热门文章

  1. COPAN为政府机构提供低成本、高效节能的数字归档方案
  2. keepalived nginx 双机热备图文讲解
  3. 怎样验证软件是否可信?是否被篡改?
  4. 提高Objective-C代码质量心机一:简化写法
  5. 如何:将项添加到缓存中
  6. 我对windows核心编程的理解之一
  7. [ZZ]关于内存中栈和堆的区别
  8. javacv入门指南:序章_建立开放文化的循序渐进指南
  9. 大开眼界百度云盘2018_文化差异的大开眼界
  10. 软件构建设计图_游戏设计如何帮助您构建更好的软件