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算法相关推荐

  1. 拓扑排序----Kahn算法和字典序最小的拓扑排序

    一.拓扑排序定义: 二.卡恩算法(Kahn): 1.Kahn算法介绍: 有向无环图DAG至少具有一个度数为0的顶点和一个度数为0的顶点. 证明:上述事实有一个简单的证明,即DAG不包含循环,这意味着所 ...

  2. (数据结构)有向图的拓扑排序 Kahn算法

    拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...

  3. 拓扑排序(Kahn算法和基于DFS求解法)

    拓扑排序是对有向无环图(DAG)进行排序,从而找到一个序列.该序列满足对于任意一对不同的顶点u,v∈V,若G中存在一条从u->v的边,则在此序列中u在v前面. 拓扑排序也可以用来判断一个有向图是 ...

  4. 拓扑排序-Kahn算法

    题目描述 众所周知, TT 是一位重度爱猫人士,他有一只神奇的魔法猫. 有一天,TT 在 B 站上观看猫猫的比赛.一共有 N 只猫猫,编号依次为1,2,3,-,N进行比赛.比赛结束后,Up 主会为所有 ...

  5. DAG拓扑排序-Kahn算法

    拓扑排序就是对一个有向无环图进行排序,使其变成一个线性关系,并且保证其前后的位置关系不改,简言之,就是把一个偏序变成一个全序(线性序). 拓扑排序有两种算法,一种是借助DFS排序,另一种是卡恩算法,这 ...

  6. 拓扑排序Kahn算法

    拓扑排序 介绍 思路 操作过程 完美图解 代码模板 介绍 拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系 思路 很好理解 操作过程 我们可以理解成一个有向图如果x事件在y事件的前面 ...

  7. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  8. 通过深度优先算法进行拓扑排序(算法导论)

    通过深度优先算法进行拓扑排序(Java) package graph; //拓扑排序用深度优先算法实现 import java.io.IOException; import java.util.Sca ...

  9. 14.2 拓扑排序DFS算法

    文章目录 原理 Python代码 测试数据 原理   三色标记DFS天然适合拓扑排序.因为三色标记DFS是先查看栈顶元素,如果不是黑色,说明子元素(邻居)还没压栈.这个时候再将子元素压入栈,后续出栈的 ...

最新文章

  1. Android关闭USB的ADB调试和文件传输功能(禁用USB)
  2. TableLayoutPanel
  3. 【java开发系列】—— 自定义注解
  4. java dictionary 实例化_Java Dictionary put()用法及代码示例
  5. ECshop网点程序优化-后台添加类目自动选择上次父类目并计算Sort Order
  6. Linux之Vim的搜索与替换
  7. Web安全笔记-Fidder与浏览器找关键Cookie(Cookie劫持前的准备)
  8. PyQt 5.4参考指南 ---- PyQt5和PyQt4之间的差异
  9. cocos2dx打飞机项目笔记二:BulletLayer类
  10. 两年ACM竞赛的所有算法总结
  11. Ceph:一个新时代的开始
  12. SQLGrammarException错误
  13. 机器学习案例系列教程——距离度量方法总结
  14. redis数据库实例
  15. Keil MDK 5安装了GD32 pack包工程里却找不到
  16. 自媒体剪辑中常用的premere快捷键
  17. 风压和功率计算公式轴流式_离心风机风压计算
  18. LT2611UXC 2-PORTLVDS 转HDMI2.0
  19. 我的世界(方块地图)生成
  20. 生产者消费者模型详解

热门文章

  1. 一键自动整理文件!简单好用的Python脚本
  2. 如何学习SCL语言?SCL语言编程入门
  3. 层次分析法AHP原理、例题
  4. Three.js 3D建模必备基础
  5. 系统重启后接口代理服务器ip地址会变,S120启动后发现X150接口的IP地址自己变成0.0.0.0 了...
  6. JAVA第一个HelloWord程序
  7. 2023深圳服务机器人展览会定档4月9-11日
  8. linux查看lmgrd进程,FlexNet License Server Manager 'lmgrd' 组件栈缓冲区溢出漏洞
  9. 康佳电视KKTV无法开机刷机方法
  10. 清华大学公开课线性代数2——第3讲:奇异值分解