1. 实验环境

(1)Visual Studio 2019(32位调试器)

(2)Windows 10

2. 多段图描述

多段图G = (V,E)是一个带权有向图,它具有以下特性:

图中的节点被划分成K>=2个互不相交的子集Vi, 1<=i<=k。其中V1和Vk分别只有一个节点,V1包含源点s,Vk包含汇点t。对所有边<u,v>∈E,多段图要求若u∈Vi,则v∈V(i+1)(1<=i<k),边上的权值位w(u,v)。从s到t的路径长度是这条路径上边的权值之和。

多段图问题,是求从s到t的一条长度最短的路径。

3. 算法的具体实现

定义了cost[ ]和d[ ],cost[ i ]用于存储到从节点 i 到汇点(t)的最短权值之和; d[ i ]用于存储 i 节点所指向的权值最小的节点,如上图中:

cost[10] = 5, d[10] = 11

cost[9] =  2, d[9] = 11

cost[8] = 4, d[8] = 11

cost[7] = 7, d[7] = 9

cost[6] = 5, d[6] = 9

cost[5] = 7, d[5] = 9

cost[4] = 15, d[4] = 7

cost[3] = 18, d[3] = 7

cost[2] = 9, d[2] = 5

cost[1] = 7, d[1] = 6

cost[0] = 16, d[0] = 2

所以算法执行结束cost[ 0 ],即为 源点--->汇点 的最短路径。

多段图的动态规划算法

传入参数node为节点个数,G为引用图的数据结构

float FMultiGraph(ALGraph& G, int node) {float* cost = new float[node];int q, * d = new int[node];cost[node - 1] = 0;d[node - 1] = -1;for (int i = node-2; i >= 0; --i){float min = 65535;for (ArcNode *p = G.adjlist[i].FirstArc ; p; p=p->nextArc){int v = p->adjvex;if ((p->weight + cost[v]) < min){min = p->weight + cost[v];q = v;}}cost[i] = min;d[i] = q;}float c = cost[0];return c;
}

图的邻接表结构定义

//定义临界表边结点
typedef struct ArcNode
{int adjvex;int weight;     //权值struct ArcNode* nextArc;
}ArcNode;//定义临界表表头结点
typedef struct VertexNode
{int vertex;int jieduan;    //阶段ArcNode* FirstArc;
}VertexNode;//定义图的临接表类型
typedef struct ALGraph
{VertexNode adjlist[max];    //max define为100
}ALGraph;

图的邻接表创建

void creatGraph(ALGraph &G, int node,int edge){//初始化多少个图节点 以及图各节点的名称for (int i = 0; i < node; i++){int NodeName = 0, jieduan = 0;cin >> NodeName >> jieduan;G.adjlist[i].vertex = NodeName;G.adjlist[i].jieduan = jieduan;G.adjlist[i].FirstArc = NULL;}for (int i = 0; i < edge; i++){int from = 0, to = 0, weight = 0; //从 from 节点开始到 to节点  权值为 weightcin >> from >> to >> weight;ArcNode* p = new ArcNode; p->adjvex = to; p->weight = weight;p->nextArc = G.adjlist[from].FirstArc;G.adjlist[from].FirstArc = p;}
}

图的打印

void printfGraph(ALGraph& G, int node) {for (int i = 0; i < node; i++){cout << "V" << G.adjlist[i].jieduan << ": " << G.adjlist[i].vertex << " -> ";ArcNode* temp =  G.adjlist[i].FirstArc;while (temp){cout << temp->adjvex << "(" << temp->weight << ") -> ";temp = temp->nextArc;}cout << "NULL" << endl;}
}

主函数如下

int main() {ALGraph G;int node = 0, edge = 0;cin >> node >> edge;creatGraph(G, node, edge);printfGraph(G, node);float lujing = FMultiGraph(G, node);cout << "最短路径为:" << lujing << endl;system("pause");return 0;
}

4. 测试数据输入及输出

使用测试数据输入如下(使用文件重定向将数据写入文件再使用)使用方法如下

打开

找到你生成.exe的文件目录下

再上面打开的X86 管理员界面输入 dos命令 程序 <输入文件> 输出文件

例如我这里是: test.exe <in.txt> out.txt

完成上述操作后可得到一个 out.txt 的文件为输出文件如下:

多段图的动态规划算法(C/C++)相关推荐

  1. 八十五、Python | Leetcode数据结构之图和动态规划算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. 动态规划——多段图问题

    多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛. 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离. 分析设计 ...

  3. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

  4. 动态规划多段图和货郎担问题

    一.实验目的 1.掌握能用动态规划方法求解的问题应满足的条件: 2.加深对动态规划方法的理解与应用: 3.锻炼学生对程序跟踪调试能力: 4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力. ...

  5. 动态规划中的多段图问题

    多段图的最短路径问题:只有相邻的节点之间有联系 多段图的定义: 1.多段图是一个有向.无环.带权 图. 2.有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target). 3.它有n ...

  6. 动态规划求解多段图问题

    动态规划求解多段图问题(非递归) 问题描述 求解思路 动态规划逆序解法 逆序实现代码 动态规划逆序解法 顺序实现代码 问题描述 如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示 ...

  7. 动态规划求解多段图最短路径

    动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 ...

  8. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  9. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

最新文章

  1. 多线程下的HashMap竟然绕环了
  2. linux resouce,platform_device和platform_driver驱动的关系
  3. c++采集声卡输出_其实声卡不单单只有音效,更多功能看这篇就对了
  4. 线性表及其逻辑和存储结构(二级)
  5. 验证OpenStack安装
  6. openjdk(HOTSPOT)垃圾回收源码解读
  7. Java基础-序列化和反序列化
  8. 孙鑫MFC笔记之十六--Active控件
  9. 计算机网络数据链路层之扩展以太网(含以太网交换机及虚拟局域网)
  10. nyoj 最强DE 战斗力 (数论入门)
  11. 金九银十北漂记第3篇:再见,中国航信!
  12. Java项目:基于jsp+mysql+Spring+SpringMVC+mybatis的高速公路收费管理系统
  13. SQLite 基本语法(二)
  14. Model of an Electric Arc for Circuit Analysis(翻译)
  15. 协议篇————3、DUP协议详解
  16. 《HelloGitHub》第 48 期
  17. java dispose事件_求助!!为什么我的dispose()不起作用
  18. 木材材积表快速计算器_木材材积表计算器
  19. 没有了老师,该如何学习?
  20. 苹果软件更新在哪里_【软件资讯】苹果发布 iOS 13.3.1 / iPadOS 13.3.1 正式版更新...

热门文章

  1. WebAssembly 将成为互联网的终结?
  2. 陆奇:疫情下的创业者,最不能缺这两大能力
  3. 港中文用 Zoom 考试,中途遭黑客入侵传播不可描述内容
  4. 天猫回应“双11数据造假”:已启动司法流程;小米折叠手机专利曝光;ASP.NET感染勒索软件|极客头条...
  5. 阿里乌镇大动作:平头哥开源 MCU 设计平台!
  6. 重磅!Facebook 更新 PyTorch 1.1,打算跨 GPU 分割神经网络 | 技术头条
  7. 程序员版的「倚天屠龙」,看完泪奔!
  8. 郭台铭“炮轰”微软;腾讯应用宝全面封禁多闪;波音更新飞行软件 | 极客头条...
  9. 谷歌安卓之父离职内幕;抖音上线小程序;苹果被罚千万 | 极客头条
  10. 携程否认竞价排名;戴尔为“吃鸡外挂”致歉;腾讯将发区块链游戏 | CSDN极客头条