多段图的动态规划算法(C/C++)

这篇具有很好参考价值的文章主要介绍了多段图的动态规划算法(C/C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 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的一条长度最短的路径。

多段图的动态规划算法(C/C++)

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节点  权值为 weight
		cin >> 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. 测试数据输入及输出

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

打开多段图的动态规划算法(C/C++)

 找到你生成.exe的文件目录下多段图的动态规划算法(C/C++)

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

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

多段图的动态规划算法(C/C++)

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

多段图的动态规划算法(C/C++)

 文章来源地址https://www.toymoban.com/news/detail-443642.html

到了这里,关于多段图的动态规划算法(C/C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法设计与分析 实验三 动态规划

    1.打家劫舍:  给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 入: 每组测试案例有两行,第一行只有一个整数N,代表着有N间房屋 第二行有N个整数,代表着每间房屋里的金额,金额范围[0, 1000]。 出:

    2024年01月24日
    浏览(76)
  • 算法设计与分析实验:动态规划与贪心

    目录 一、零钱兑换 1.1 思路一:动态规划 1.2 思路二:贪心 二、安排工作以达到最大效益 2.1 具体思路 2.2 思路呈现 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、雇佣k名工人的最低成本 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 结尾语 “生活有意思的

    2024年02月19日
    浏览(64)
  • 【Python算法】实验12-动态规划与背包问题

    目录 实验内容 1.数塔dp -A 2.骨牌铺方格 3.一只小蜜蜂

    2024年02月15日
    浏览(40)
  • 【Python算法】实验8-动态规划与背包问题

    目录 实验内容 1.数塔dp -A 2.骨牌铺方格 3.一只小蜜蜂

    2023年04月19日
    浏览(66)
  • 算法设计与分析—动态规划作业一(头歌实验)

    任务描述 本关任务:求一个序列的最长上升子序列。 相关知识 最长上升子序列问题 当一个序列 Bi 满足 B1 B2 ... Bs 的时候,我们称这个序列是 上升 的。对于给定的一个序列 a1, a2, ..., aN ,我们可以在其中找到一些上升的子序列。 现在给你一个序列,请你求出其中 最长 的上

    2024年02月04日
    浏览(122)
  • 算法设计与分析—动态规划作业二(头歌实验)

    任务描述 本关任务:计算寻宝人所能带走的宝物的最大价值。 一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有 n 个宝物( n 不超过 20 ),每个宝物的重量不同,价值也不同,宝物 i 的重量是 wi ,其价值为 vi 。 寻宝人所能拿走的宝物的总重量为 m ( m 不超过 50 )。请

    2024年02月06日
    浏览(72)
  • 南邮|算法分析与设计实验二 动态规划法

    目录 实验目的 实验内容 实验步骤 一、最长公共子序列 二、矩阵连乘  加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的 最长公共子序列问题 和 矩阵连乘问题 ,体会 动态规划法 和 备忘录方法 的异同。 一、用动态规划法和备忘录方法

    2024年02月01日
    浏览(42)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(58)
  • 算法设计与分析实验二:动态规划法求解TSP问题和01背包问题

    【实验内容】 (1)tsp问题:利用动态规划算法编程求解TSP问题,并进行时间复杂性分析。 输入:n个城市,权值,任选一个城市出发; 输出:以表格形式输出结果,并给出向量解和最短路径长度。 (2)01背包问题:利用动态规划算法编程求解0-1背包问题,并进行时间复杂性分

    2024年02月03日
    浏览(55)
  • 算法设计与分析实验4 :利用动态规划的方法解决子集等和分割判断问题

    实验4  利用动态规划的方法解决子集等和分割判断问题 一、实验目的 1. 了解动态规划的主要思想。 2. 掌握背包问题解决方法用以解决该问题。 3. 分析核心代码的时间复杂度和空间复杂度。 二、实验内容和要求 题目:给定一个只包含正整数的非空数组。是否可以将这个数组

    2024年04月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包