请你写一段拓扑排序的c++代码

时间: 2023-03-09 20:41:48 浏览: 115
我们可以使用深度优先搜索(DFS)算法来解决拓扑排序问题。下面是一个C语言实现的拓扑排序的DFS算法的代码示例:#include <stdio.h> #include <stdlib.h>// 最大的顶点个数 #define MAXV 1000// 用于表示边的结构 struct edge{ int y; // 边的终点 int weight; // 权重 struct edge *next; // 下一条边 };// 图的结构 struct graph{ struct edge *edges[MAXV + 1]; // 边表头指针 int degree[MAXV + 1]; // 各顶点的度 int nvertices; // 顶点数 int nedges; // 边数 };// 初始化一个有向图 void initialize_graph(struct graph *g, int directed){ int i; g->nvertices = 0; g->nedges = 0; for (i = 1; i <= MAXV; i++) { g->degree[i] = 0; g->edges[i] = NULL; } }// 插入一条边 void insert_edge(struct graph *g, int x, int y, int directed){ struct edge *p; // 临时指针 p = malloc(sizeof(struct edge)); // 分配空间 p->weight = 0; p->y = y; p->next = g->edges[x]; g->edges[x] = p; // 插入到边表头 g->degree[x]++; if (directed == 0) insert_edge(g,y,x,1); else g->nedges++; }// 拓扑排序的DFS void topological_sort(struct graph *g, int visited[], int *sorted, int n){ int i; struct edge *p; for (i = 1; i <= g->nvertices; i++) { if (visited[i] == 0) { p = g->edges[i]; while (p != NULL) { topological_sort(g, visited, sorted, p->y); p = p->next; } visited[i] = 1; sorted[n--] = i; } } }int main(){ int i; struct graph g; int visited[MAXV + 1]; int sorted[MAXV + 1]; initialize_graph(&g, 0); insert_edge(&g, 1, 2, 0); insert_edge(&g, 1, 3, 0); insert_edge(&g, 2, 4, 0); insert_edge(&g, 2, 5, 0); insert_edge(&g, 3, 6, 0); insert_edge(&g, 3, 7, 0); insert_edge(&g, 4, 8, 0); insert_edge(&g, 5, 8, 0); for (i = 1; i <= MAXV; i++) visited[i] = 0; topological_sort(&g, visited, sorted, g.nvertices); for (i = 1; i <= g.nvertices; i++) printf("%d ", sorted[i]); printf("\n"); return 0; }

相关推荐

void IntersectionInfoCache::get_node_info( const RoadLinkInfo* curlink, NodeInfo& nodeInfo, bool start ) //获取节点信息 { TopoLinkItem* outlinklist = start ? curlink->sTopoLinks.outTopoItems : curlink->eTopoLinks.outTopoItems; uint8_t outlinkCount = start ? curlink->sTopoLinks.outCount : curlink->eTopoLinks.outCount; for ( int i = 0; i < outlinkCount; ++i ) { uint32_t out_index = static_cast< int32 >( outlinklist[ i ].linkIdx ); uint8_t out_direction = ( outlinklist[ i ].attr & 0x01 ); nodeInfo.outlinks.emplace_back( LinkSymbol( out_index, out_direction ) ); const RoadLinkInfo* outlink = RGDataManagerInstance->GetRoadInfoPtr( out_index ); if ( outlink == nullptr ) continue; TopoLinkItem* inlinklist = out_direction ? outlink->eTopoLinks.inTopoItems : outlink->sTopoLinks.inTopoItems; uint8_t inlinkCount = out_direction ? outlink->eTopoLinks.inCount : outlink->sTopoLinks.inCount; for ( int j = 0; j < inlinkCount; ++j ) { //获取所有脱出路的进入路 uint32_t in_index = static_cast< int32 >( inlinklist[ j ].linkIdx ); uint8_t in_direction = ( ( inlinklist[ j ].attr & ( 0x01 ) ) ^ ( 0x01 ) ); nodeInfo.inlinks.emplace_back( LinkSymbol( in_index, in_direction ) ); } } std::sort( nodeInfo.inlinks.begin(), nodeInfo.inlinks.end() ); nodeInfo.inlinks.erase(std::unique( nodeInfo.inlinks.begin(), nodeInfo.inlinks.end() ), nodeInfo.inlinks.end() ); std::sort( nodeInfo.outlinks.begin(), nodeInfo.outlinks.end() ); nodeInfo.outlinks.erase(std::unique( nodeInfo.outlinks.begin(), nodeInfo.outlinks.end() ), nodeInfo.outlinks.end() ); }结合上一段代码,逐句加上注释

最新推荐

recommend-type

C++实现拓扑排序(AOV网络)

主要为大家详细介绍了C++实现拓扑排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

数据结构课设拓扑排序源代码(教学计划安排)

数据结构课设报告,包括完整源代码,用拓扑排序算法安排有先后制约关系的课程的教学计划。
recommend-type

输出所有可能拓扑排序代码.doc

输出所有可能拓扑排序代码 本程序使用C++语言编写 ,使用STL 测试运行平台为Visual Studio 2010
recommend-type

基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip

【资源说明】 基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
recommend-type

梯度下降算法:介绍梯度下降算法 实例说明其运行原理

梯度下降算法,介绍梯度下降算法 实例说明其运行原理,供学习参考。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。