拓扑排序的两种求法:

First:利用discoverTime(发现时间)&finishTime(结束时间)
Second:利用入度

第一种:



Code:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int ans=1,flagCycle=0;//开始时间初值 标志位-是否存在回路
vector<int>tp;//拓扑系列
vector<vector<int>>g;//邻接表
vector<bool>visit;//是否被访问过
vector<int>discoverTime,finishTime;//发现时间 结束时间
int N,M;
void dfs(int x){discoverTime[x]=ans++;//记录发现时间 visit[x]=true;for(int i=0;i<g[x].size();i++){//找X的邻接点 if(discoverTime[g[x][i]]==0)//判断这个点是否访问过 没被访问则进行访问 dfs(g[x][i]);//如果g[x][i]节点的finishTime为0说明还有邻接点未被访问到//discoverTime[x]<discoverTime[g[x][i]]说明x节点又访问它前面的节点 //没有回路的图是不会在此节点未访问完前 去访问其祖先的节点 else if(finishTime[g[x][i]]==0&&discoverTime[g[x][i]]<discoverTime[x]){//判断是否存在回路 flagCycle=1;return;}}tp.push_back(x);//记录下拓扑排序序列  finishTime[x]=ans++;
}
int main(){cin>>N>>M;//节点下标从1开始 g.resize(N+1);visit.resize(N+1);discoverTime.resize(N+1);finishTime.resize(N+1);for(int i=0;i<M;i++){int a,b;cin>>a>>b;g[a].push_back(b);}for(int i=1;i<=N;i++) if(!visit[i])dfs(i);if(flagCycle)//判断flagCycle是否为1  cout<<"存在回路";else{cout<<"拓扑排序为:"<<endl;for(int i=tp.size()-1;i>=0;i--)cout<<"id:"<<tp[i]<<" "<<"discoverTime: "<<discoverTime[tp[i]]<<" "<<"FinishTime: "<<finishTime[tp[i]]<<endl;} return 0;
}

第二种:



Code:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
using namespace std;
vector<vector<int>>g;
vector<int>numEdg;
vector<int>Path;
queue<int>Enq;
int N,M;
int flagCycle=0,cnt=1;
void TopSort(){int v; for(int i=1;i<=N;i++)//查找是否存在入度为0的节点 if(numEdg[i]==0)Enq.push(i);//把入度为0的结点放入队列里 while(!Enq.empty()){//判断队列是否为空  v=Enq.front();//取对头元素 Path.push_back(v);//把它加入拓扑排序队列中 Enq.pop();//从队列中删除 =>从图中抹掉这个节点  for(int i=0;i<g[v].size();i++)//遍历这个节点它的所有邻接 把它们的入度-1 if(--numEdg[g[v][i]]==0){//入度减一之后节点是否为0  若为0则是拓扑排序序列中元素 cnt++;//拓扑排序个数+1 Enq.push(g[v][i]);//将入度为0的元素放入队列中 }}if(cnt!=N)//拓扑序列中的个数是否和元素个数相等  不相等说明有回路 flagCycle=1;
}
int main(){cin>>N>>M;g.resize(N+1);//邻接表 numEdg.resize(N+1);//用来存储各个节点的入度 for(int i=0;i<M;i++){int a,b,c;cin>>a>>b;g[a].push_back(b);numEdg[b]++;//统计入度个数 }TopSort();if(flagCycle)//进行判断是否存在回路 cout<<"存在回路";else{cout<<"拓扑排序序列为:"<<endl;for(int i=0;i<Path.size();i++)cout<<Path[i]<<" ";}} 

图论-拓扑排序(有向图)相关推荐

  1. Sorting It All Out (易错题+拓扑排序+有向图(判环+判有序)优先级)

    这道题目考察了拓扑排序的基本思想:每一步寻找一个入度为0的结点,然后 删除之.将这个结点指向的结点入度减1.删除从这个结点出发的所有边 同时考察了对于一个有向图是否有环.是否严格有序的判断.(当发现多 ...

  2. 2022.3.24 图论——拓扑排序算法

    文章目录 一.拓扑排序简介 二.例题 1.题目 2.分析 3.代码 一.拓扑排序简介 1.Topological Sorting,指的是一个DAG(Directed Acyclic Graph)即有向 ...

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

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

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

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

  5. 图论--拓扑排序--模板

    //字典序号最小 #include <cstdio> #include <cstring> #define MAXN 517 int G[MAXN][MAXN]; //路径 i ...

  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. 【算法练习】数据结构/图论 poj4084:拓扑排序

    题目链接:http://bailian.openjudge.cn/practice/4084 4084:拓扑排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一个图的结构,输出其 ...

  10. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

最新文章

  1. Helm 3 发布 | 云原生生态周报 Vol. 27
  2. Git新建临时分支进行开发后合并至master
  3. 【Mybatis】 mapper 继承
  4. Linux中的火墙策略优化(iptables,firewalld)
  5. webpack入坑指南
  6. 微软在线office online 使用时遇到的一些问题
  7. Java 实例 - 查找 List 中的最大最小值
  8. 130242014051 《商品详情模块》需求分析与设计实验课小结
  9. 玩水——西沙:在海的远处,水是那么蓝那么清
  10. 2022最新独立版智狐聚合支付V1.0.5.21+聚合支付系统源码
  11. 华为手撕代码+剑指offer总结 (python+c语言)
  12. 元宇宙来袭的五个趋势
  13. Python鼠标点击图片,获取点击点的像素坐标/像素值
  14. postgresql.conf bgwriter_lru_multiplier
  15. 基于随机森林算法的贷款违约预测模型研究(Give me some credit)
  16. echarts,x轴y轴,配置参数详情
  17. 最新网站证书提示风险的原因和几个解决方法
  18. ue4中隐藏灯光和相机图标_[HDRP]物理灯光是什么?科普向
  19. 把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试回顾
  20. pdf转换成excel转换器哪个好

热门文章

  1. 学校机房计算机安全使用制度,学校机房安全管理制度
  2. 网页中的位图与矢量图使用
  3. linux智能系统下载软件,NI Linux RT System Image 20.5 NI Linux实时系统映像2020.09
  4. 计算机游戏程序启动错误及其解决方法汇总
  5. java 请求webservice_JAVA调用WebService实例
  6. Excel操作技巧大全
  7. IMX6ULL操作记录
  8. laravel框架解决sql注入问题
  9. 完整的Java软件开发学习路线
  10. 4K视频质量测试/4K质量评价