//字典序号最小
#include <cstdio>
#include <cstring>
#define MAXN 517
int G[MAXN][MAXN];   //路径
int in_degree[MAXN]; //入度
int ans[MAXN];
int n, m, x, y;
int i, j;bool toposort()
{for (i = 1; i <= n; i++) //从最小的开始寻找,{                        //这样保证了有多个答案时序号小的先输出int k = 1;while (in_degree[k] != 0&&k<=n) //寻找入度为零的点k++;if(k==n+1)  return 0;ans[i] = k;in_degree[k] = -1;//更新为-1,后边检测不受影响,相当于删除节点for (int j = 1; j <= n; j++){if (G[k][j])in_degree[j]--; //相关联的入度减1}}return 1;
}void init()
{memset(in_degree, 0, sizeof(in_degree));memset(ans, 0, sizeof(ans));memset(G, 0, sizeof(G));
}int main()
{while (~scanf("%d%d", &n, &m)){init();for (i = 0; i < m; i++){scanf("%d%d", &x, &y);if(G[x][y]==0) in_degree[y]++;G[x][y] = 1;}toposort();for (i = 1; i < n; i++)printf("%d ", ans[i]);printf("%d\n", ans[n]);}return 0;
}
//字典序最小2
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=500+10;
int n,m;
vector<int> G[maxn];
int in[maxn];
void topo()
{priority_queue<int,vector<int>,greater<int> > Q; //保证小值int先出队列int ans[maxn],cnt=0;for(int i=1;i<=n;i++)if(in[i]==0) Q.push(i);while(!Q.empty()){int u=Q.top(); Q.pop();ans[cnt++]=u;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(--in[v]==0)Q.push(v);}}printf("%d",ans[0]);for(int i=1;i<n;i++)printf(" %d",ans[i]);puts("");
}
int main()
{while(scanf("%d%d",&n,&m)==2){memset(in,0,sizeof(in));for(int i=1;i<=n;i++) G[i].clear();for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);in[v]++;}topo();}return 0;
}
//一般的拓扑排序
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=500+10;
int n,m;
vector<int> G[maxn];
int in[maxn];
void topo()
{priority_queue<int,vector<int>,greater<int> > Q; //保证小值int先出队列int ans[maxn],cnt=0;for(int i=1;i<=n;i++)if(in[i]==0) Q.push(i);while(!Q.empty()){int u=Q.top(); Q.pop();ans[cnt++]=u;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(--in[v]==0)Q.push(v);}}printf("%d",ans[0]);for(int i=1;i<n;i++)printf(" %d",ans[i]);puts("");
}
int main()
{while(scanf("%d%d",&n,&m)==2){memset(in,0,sizeof(in));for(int i=1;i<=n;i++) G[i].clear();for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);in[v]++;}topo();}return 0;
}

图论--拓扑排序--模板相关推荐

  1. 数据结构-图论-拓扑排序模板题(hdu3342)(poj1270)(hdu4857)

    dfs与bfs的很直接的应用就是拓扑排序. 拓扑排序如果用数组来模拟链表进行操作,既解决了稀疏图的空间问题,又解决了用链表进行操作麻烦的问题 但是拓扑排序并不是数字大小之间的排序,而是某些事情之间的顺 ...

  2. 最短工期 (25 分)【拓扑排序模板】

    立志用最少的代码做最高效的表达 一个项目由若干个任务组成,任务之间有先后依赖顺序.项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务.现给定一个项目中各个任务之间的关 ...

  3. Kahn拓扑排序模板

    Kahn拓扑排序模板 O(V+E) #include<bits/stdc++.h> using namespace std;typedef long long ll; const int ...

  4. 拓扑排序模板(Kahn算法和DFS实现)

    拓扑排序思想: Kahn模板:每次取出入度为0的顶点删掉,并删掉和该点有关的边,需要维护一个入度为0的队列或者栈 //Kahn算法,关键在于需要维护一个入度为0的顶点的集合 int n,m; int ...

  5. 图论---拓扑排序的应用

    最近研究了几道图论的题目,都是图论入门的算法,用的比较多的就是拓扑排序,多用于有着先后顺序的题目,也可以用来判断环,做个小总结. 杂物 题目链接:杂务 - 洛谷 这一题需要计算最短的时间,利用了记忆化 ...

  6. 图论--拓扑排序--HDU-1285确定比赛名次

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...

  7. 图论--拓扑排序--判断是否为DAG图

    #include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...

  8. 图论--拓扑排序--判断一个图能否被拓扑排序

    拓扑排序的实现条件,以及结合应用场景,我们都能得到拓扑排序适用于DAG图(Directed Acyclic Graph简称DAG)有向无环图, 根据关系我们能得到一个线性序列,实现的方式是DFS,具体 ...

  9. AcWing 848. 有向图的拓扑序列(拓扑排序模板)

    题面链接 https://www.acwing.com/problem/content/850/ 思路 对于一个有向图来说,只有无环有向图才有拓扑序列,也可以说一个无环有向图必然有拓扑序列,但是不唯一 ...

最新文章

  1. Oracle 常用查询
  2. Fiddler 抓包高级进阶篇-天罗地网抓包大法
  3. Cannot find reference ‘PDFDocument‘ in ‘pdfparser.py‘
  4. 让理科生沉默,让文科生落泪的文史综合题
  5. 公钥和私钥怎么生成_科普 | Eth2 验证者如何生成和保护取款密钥
  6. iOS内存暴增问题追查与使用陷阱
  7. Discuz修改笔记-Discuz代码的使用
  8. 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型
  9. IDEA-Maven的Dependencies中出现红色波浪线
  10. USACO 2.3 Controlling Companies(DFS)
  11. 顶级SaaS公司的共同基因都有什么?
  12. ROS系统学习8---节点间的内存共享(初级篇)
  13. word内容被锁定无法进行修改的解决办法
  14. JavaSE基础20笔记IO流
  15. DevOps 在公司项目中的实践落地
  16. 高等数学 —— 数列的极限
  17. 曙光服务器面板显示感叹号,磁盘阵列和磁带库面板感叹号灯橙色
  18. 法国电影《蝴蝶》Le Papillon主题曲
  19. 关于最新版mumu模拟器(2.2.16)安装xposed框架
  20. eclipselink 数据库表命名规则 驼峰转下划线/表名转换

热门文章

  1. 洛谷 P3853 [TJOI2007]路标设置
  2. HTML学习笔记05-文本格式化
  3. 【JAVA基础】四舍五入之7中舍入法
  4. RabbitMQ 安装操作
  5. 用开源项目PhotoView实现图片的双指缩放和双击放大缩小
  6. javascript数组中数字和非数字下标的区别
  7. Windows-Qt-EclipseCDT 环境问题集
  8. 被绞杀的网景:互联网门口第一滴血,互联网营销
  9. 曲靖沾益区计算机学校,【曲靖市沾益区职业技术学校-网址】2021招生简介|怎么样...
  10. php getid3,PHP getID3类的使用方法学习笔记【附getID3源码下载】