博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序
阅读量:6224 次
发布时间:2019-06-21

本文共 1447 字,大约阅读时间需要 4 分钟。

拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。    (1) 选择一个入度为0的顶点并输出之;    (2) 从网中删除此顶点及所有出边。循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。输入第一行输入两个整数n和m,n表示途中节点数,m表示途中边数;接下来输入m行,每一行有两个整数v1和v2,v1和v2分别代表编号为v1、v2的节点,每行代表一条由v1指向v2的边(节点编号从0开始);输出若途中存在环,给出提示;否则输出拓扑排序后的序列;#include 
#include
#include
#include
using namespace std; vector
> Adj; //邻接表vector
inDegree; //保存每个节点的入度stack
stk; //保存当前入度为0的节点编号 void CreatGraph(){ int n, m, v1, v2; cin >> n >> m; Adj.assign(n, list
()); inDegree.assign(n, 0); while (m--) { cin >> v1 >> v2; Adj[v1].push_back(v2); inDegree[v2]++; } for (int i = 0; i < n;i++) if (inDegree[i] == 0) stk.push(i);}void tpSort(){ vector
vec; int v; while (!stk.empty()) { v = stk.top(); stk.pop(); //inDegree[v] = -1; //遍历与节点v相连的节点 for (auto it = Adj[v].begin(); it != Adj[v].end(); it++) { inDegree[*it]--; if (inDegree[*it] == 0) stk.push(*it); } //Adj[v].clear(); //本行可以省略,以提升程序效率 vec.push_back(v); } if (vec.size() != inDegree.size()) { cout << "图中存在环路,不能进行拓扑排序!\n"; return; } for (auto item : vec) cout << item << " "; cout << endl;}int main(){ CreatGraph(); tpSort(); system("pause"); return 0;}

 

转载于:https://www.cnblogs.com/coodyz/p/10596892.html

你可能感兴趣的文章
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
《别做正常的傻瓜》的一些读书心得
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
PMP考试的过与只是
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
oracle12C 重做日志
查看>>
awk-sed
查看>>
zookeeper与kafka安装部署及java环境搭建(发布订阅模式)
查看>>
编码规约
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
一年成为Emacs高手(像神一样使用编辑器)
查看>>
透过【百度地图API】分析双闭包问题
查看>>
iis配置网址(主机名)
查看>>
把DATATABLE,DS中的内容用HTML的方式显示
查看>>