拓扑排序——Kahn算法
Kahn算法
#include <iostream>
#include<vector>
#include<list>
using namespace std;// 图结构
class Graph
{
public:int v; // 顶点个数typedef vector<int>* node;node *adj; // 邻接表Graph(int data):v(data){adj = new node[v];for (int i = 0; i < v; ++i){adj[i] = new vector<int>; // 每个顶点后面跟着一条链}}void addEdge(int s, int t){adj[s-1]->push_back(t); // 以s为顶点,t接在s后面}~Graph(){for (int i = 0; i < v; ++i){delete adj[i];}delete []adj;}void print(){for (int i = 0; i < v; ++i){cout << i+1 << " 的入度: " ;for (int j = 0; j < adj[i]->size(); ++j){cout << adj[i]->at(j) << " ";}std::cout << endl;}}
};// 先找一个入度为0的点。打印输出
// 且把此点删除(标记)
// 循环输出所有点
void topoSortByKahn(int v, vector<int>* *adj)
{int *inDegree = new int[v](); // 统计每个顶点的入度,初始化为0for (int i = 0; i < v; ++i){for (int j = 0; j < adj[i]->size(); ++j){int w = adj[i]->at(j); // i->wif (w != 0){inDegree[(w-1)]++; // w为具体的值,所以当索引使用时,需要-1}}}std::list<int> queue;for (int i = 0; i < v; ++i){if (inDegree[i] == 0){queue.push_back(i); // 记录入度为0的顶点的索引}}while (!queue.empty()) // 入度为0的顶点,非空{int i = queue.front(); // 取出第一个入度为0索引cout << " <- " << i+1 << endl; // 输出值queue.remove(i); // 删除第一个入度为0的索引for (int j = 0; j < adj[i]->size(); ++j) // 查找i后面的指向i的顶点{int k = adj[i]->at(j); // k为值inDegree[(k-1)]--;if (inDegree[(k-1)] == 0){queue.push_back(k-1); // 压进去的依然是索引}}cout << endl;}
}int main()
{// 初始化一个拥有6个顶点的有向图const int n = 6;Graph G(n); // (num1, num2);表示: num1 <- num2, G.addEdge(1,0);G.addEdge(2,1);G.addEdge(5,2);G.addEdge(3,1);G.addEdge(4,2);G.addEdge(5,3);G.addEdge(6,5);G.addEdge(6,4);cout << "插入的数据:" << endl;G.print();cout << "输出topo排序: " << endl;topoSortByKahn(G.v, G.adj);system("pause");return 0;
}
拓扑排序——Kahn算法相关推荐
- 拓扑排序----Kahn算法和字典序最小的拓扑排序
一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...
- (数据结构)有向图的拓扑排序 Kahn算法
拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...
- 拓扑排序(Kahn算法和基于DFS求解法)
拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...
- 拓扑排序-Kahn算法
题目描述 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所有 ...
- DAG拓扑排序-Kahn算法
拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...
- 拓扑排序Kahn算法
拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...
- Poj 1094 拓扑排序Kahn
Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...
- 通过深度优先算法进行拓扑排序(算法导论)
通过深度优先算法进行拓扑排序(Java) package graph; //拓扑排序用深度优先算法实现 import java.io.IOException; import java.util.Sca ...
- 14.2 拓扑排序DFS算法
文章目录 原理 Python代码 测试数据 原理 三色标记DFS天然适合拓扑排序.因为三色标记DFS是先查看栈顶元素,如果不是黑色,说明子元素(邻居)还没压栈.这个时候再将子元素压入栈,后续出栈的 ...
最新文章
- Android关闭USB的ADB调试和文件传输功能(禁用USB)
- TableLayoutPanel
- 【java开发系列】—— 自定义注解
- java dictionary 实例化_Java Dictionary put()用法及代码示例
- ECshop网点程序优化-后台添加类目自动选择上次父类目并计算Sort Order
- Linux之Vim的搜索与替换
- Web安全笔记-Fidder与浏览器找关键Cookie(Cookie劫持前的准备)
- PyQt 5.4参考指南 ---- PyQt5和PyQt4之间的差异
- cocos2dx打飞机项目笔记二:BulletLayer类
- 两年ACM竞赛的所有算法总结
- Ceph:一个新时代的开始
- SQLGrammarException错误
- 机器学习案例系列教程——距离度量方法总结
- redis数据库实例
- Keil MDK 5安装了GD32 pack包工程里却找不到
- 自媒体剪辑中常用的premere快捷键
- 风压和功率计算公式轴流式_离心风机风压计算
- LT2611UXC 2-PORTLVDS 转HDMI2.0
- 我的世界(方块地图)生成
- 生产者消费者模型详解
热门文章
- 一键自动整理文件!简单好用的Python脚本
- 如何学习SCL语言?SCL语言编程入门
- 层次分析法AHP原理、例题
- Three.js 3D建模必备基础
- 系统重启后接口代理服务器ip地址会变,S120启动后发现X150接口的IP地址自己变成0.0.0.0 了...
- JAVA第一个HelloWord程序
- 2023深圳服务机器人展览会定档4月9-11日
- linux查看lmgrd进程,FlexNet License Server Manager 'lmgrd' 组件栈缓冲区溢出漏洞
- 康佳电视KKTV无法开机刷机方法
- 清华大学公开课线性代数2——第3讲:奇异值分解