博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ESWIN编程大赛】二、《有向无环图(DAG)中所有顶点的最长路径》求解
阅读量:2028 次
发布时间:2019-04-28

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

一、问题描述

问题:求解有向无环图(DAG)中所有顶点的最长路径。

输入

顶点个数:n边个数:m

输出

每个顶点的起始边对应的索引:outVertices[n]每条边的终点及该边的权重:outEdges[m*2]:

在这里插入图片描述

在这里插入图片描述
输入数据说明:

  • 1)outVertices[0] = 0且outVertices[1] = 4, 因此以顶点0为起点的边共有4条,对应的终点记录在outEdges[0:3],分别为1/2/4/5,边的权重分别为4/7/1/8。
  • 2) outVertices[1] = 4且outVertices[2] = 6, 因此以顶点1为起点的边共有2条,对应的终点记录在outEdges[4:5],分别为2/5,边的权重分别为2/10。
  • 3) outVertices[2] = 6且outVertices[3] = 6, 因此没有以顶点2为起点的边。

二、实现算法

串行算法基于x86平台测试

首先,定义两个数组longest[n]和inDegree[n],分别表示每个顶点的最长路径和入度, longest[n]初始化为0,接着依次进行:

  1. 每个顶点的入度为以该顶点为终点的边的个数,因此遍历outEdges可计算出每个顶点的入度,示例图入度计算结果如下:
0 1 2 3 4 5
1 2 4 0 3 2
  1. 遍历所有顶点的入度,记录入度为0的顶点到队列 V d o n e V_done Vdone中,这些顶点的最长路径为0,对于示例图:Vdone = {3}

  2. 循环处理Vdone队列直到队列为空:从Vdone队列取出顶点Vi ,对于以Vi 为起点的边Vi -> Vj , 更新longest[Vj] = max(longest[Vj], longest[Vi]+weight(Vi -> Vj))。 如果边Vi-> Vj是顶点Vj的最后一条入边,则longest[Vj]已确定,添加Vj到队列Vdone中。

对于示例图,算法处理步骤如下:

在这里插入图片描述

示例图各顶点最长路径计算结果如下:

在这里插入图片描述


参考

转载地址:http://fjnaf.baihongyu.com/

你可能感兴趣的文章
Linux性能优化从入门到实战:17 网络篇:网络基础
查看>>
Jupyter Notebook 安装与使用
查看>>
OpenVINO 安装及使用
查看>>
《C++性能优化指南》
查看>>
Nginx 和 Apache 优缺点
查看>>
Linux性能优化从入门到实战:08 内存篇:内存基础
查看>>
Linux性能优化从入门到实战:12 内存篇:Swap 基础
查看>>
TensorFlow 安装及使用
查看>>
Linux性能优化从入门到实战:16 文件系统篇:总结磁盘I/O指标/工具、问题定位和调优...
查看>>
NLP 自然语言处理之综述
查看>>
VVSN.exe [进程知识库 发表于 2005-12-14 23:40:00]
查看>>
摒弃盗版,让我们拥有正版,给你最实用的软件。有效的优化
查看>>
QEMU-VMWARE的开源替代品
查看>>
通过chroot方式安装Arch Linux
查看>>
17 个基于 Web 的 MS Office 竞争对手
查看>>
MySQL学习笔记
查看>>
MySQL优化经验
查看>>
inux下安装mysql
查看>>
emule原理
查看>>
(转载addone)完全使用Linux作为桌面系统 —— 使用Linux两年记 --软件列表
查看>>