【图论训练】最小拓扑序
最小拓扑序
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
【图论训练】最小拓扑序相关推荐
- 字典序最小是什么意思_《拓扑序简介》第十六讲
这是民科+大忽悠+地摊报告,我准备把拓扑序吹成天上有地上无.人见人爱.老幼咸宜.不买会后悔的什么东西.珍惜青春,珍惜钱包,请大家谨慎对待大忽悠.下面是回放视频的链接. 蔻享--共享科学.传播科学ww ...
- 【图论专题】拓扑排序
拓扑排序 给定一张有向无环图,若一个序列A满足图中的任意一条边(x,y)x都在y的前面呢么序列A就是图的拓扑排序 实际上拓扑排序就是满足所有的边x指向y,x一定在y的前面.这样按照拓扑排序递推,就可以 ...
- 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解
本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...
- 【XSY3325】社保(拓扑序)
显然我们先缩点,之后转化为一个 DAG,设为 GGG,设由其反边构成的图为 G′G'G′.题意就是求所有 "好的" 点,其中一个 "好的" 点需要满足这个点在 ...
- 1396:病毒 (拓扑序)
[题目描述] 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母.现在怎么恢复原来的文档呢!小y很 ...
- #ACW 4084 号码牌(无向图连通性+简单拓扑序)
1.题意 链接: 原题链接. 给你一个1~n全排列A,让你判断能否通过一种操作使之变为目标排列B.该操作是:交换与当前下标i相距did_idi的2个元素. 如:下标为5,d5=2d_5=2d5=2 ...
- tarjan+拓扑序+差分--2018.10.16模拟赛T2
题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...
- AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)
整理的算法模板:ACM算法模板总结(分类详细版) 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航 ...
- 图论--DAG与拓扑排序
拓扑排序概念 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序: 每个顶点出现且只出现一次: 若A 在序列中排在B 的前面,则在图中不存在从B 到 A的路径 ...
最新文章
- 设置session失效的几种方法
- android log4,GitHub - oronno/log4android: Log4Android - Simple Logging Wrapper Library for Android
- nda协议_如何将NDA项目添加到您的投资组合
- 【LeetCode笔记】301. 删除无效的括号(Java、DFS、字符串)
- LNMP源码安装脚本
- 让自己开发的Web应用程序与SharePoint共存
- 25 年 IT 老兵零基础写小说,作品堪比《三体》| 人物志
- jquery中单选选中及清除选中状态
- 十分钟教你使用NoteExpress
- Mixgo CE初体验
- 2019Thinking(上) -- 一个前端开发者的个人思考
- 为什么Java中的float型最大值大于long型?
- 如何区分PCA PCoA NMDS LDA t-SNE?
- 磨金石学院来报道,电影剪辑有哪些技巧呢?如何让你的剪辑片段更为精彩。
- 【代码超详解】LightOJ 1197 Help Hanzo(区间质数筛法)
- 透明质酸(玻尿酸)ELISA试剂盒解决方案
- 喜茶奶茶技术培训哪里学?
- 谷歌公布云游戏平台「Stadia」 预计2019年上线
- 读书笔记:《探索大脑的内部世界》
- 超微服务器硬盘红灯_服务器硬盘亮红灯崩溃怎么办?数据丢失都是怎么找回的...