多段图问题-动态规划解法

news2024/10/6 2:30:55

一、多段图问题

问题描述:设图G=(V, E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得对于E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m (1≤i≤k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。多段图的最短路径问题求从源点到终点的最小代价路径。

二、抽象分析

设Cu-v表示多段图的有向边<u, v>上的权值,将从源点s到终点t的最短路径长度记为d(s, t),考虑原问题的部分解d(s, v),显然有下式成立:

d(s, v) =Cs-v (<s, v>∈E)

d(s, v) = min{d(s, u) + Cu-v}  (<u, v>∈E)

1.循环变量j从1~n-1重复下述操作,执行填表工作

   1.1考察顶点j的所有入边,对于边<i,j>∈E,执行下述操作

       1.1.1cost[j]=min{cost[i]+c[i][j]};

       1.1.2path[j]=使cost[i]+c[i][j]最小的i;

     1.2 j++;

2.输出最短路径长度cost[n-1];

3.循环变量i=path[n-1].循环直到path[i]=0,输出最短路径经过的顶点;

   3.1 输出path[i];

   3.2 i=path[i]

三、例题具体分析

首先求解初始子问题,可直接获得:

d(0, 1)=c01=4(0→1)

d(0, 2)=c02=2(0→2)

d(0, 3)=c03=3(0→3)

再求解下一个阶段的子问题,有:

d(0, 4)=min{d(0, 1)+c14, d(0, 2)+c24}=min{4+9, 2+6}=8(2→4)

d(0, 5)=min{d(0, 1)+c15, d(0, 2)+c25, d(0, 3)+c35}=min{4+8, 2+7, 3+4} 

           =7(3→5)

d(0, 6)=min{d(0, 2)+c26, d(0, 3)+c36}=min{2+8, 3+7}=10(2→6)

再求解下一个阶段的子问题,有:

d(0, 7)=min{d(0, 4)+c47, d(0, 5)+c57, d(0, 6)+c67}=min{8+5, 7+8, 10+6}

           =13(4→7)

d(0, 8)=min{d(0, 4)+c48, d(0, 5)+c58, d(0, 6)+c68}=min{8+6, 7+6, 10+5}

           =13(5→8)

直到最后一个阶段,有:

d(0, 9)=min{d(0, 7)+c79, d(0, 8)+c89}=min{13+7, 13+3}=16(8→9)

再将状态进行回溯,得到最短路径0→3→5→8→9,最短路径长度16。

(附输入)

10 18
0 1 4
0 2 2
0 3 3
1 4 9
1 5 8
2 4 6
2 5 7
2 6 8
3 5 4
3 6 7
4 7 5
4 8 6
5 7 8
5 8 6
6 7 6
6 8 5
7 9 5
8 9 3

四、代码

#include<iostream>
using namespace std;

int vnum, arcnum;
int arc[100][100];
const int INT_MAX1 = 999;

void printArc()
{
	cout << "邻接矩阵为:" << endl;
	for (int i = 0; i < vnum; i++)
	{
		for (int j = 0; j < vnum; j++)
		{
			cout << arc[i][j] <<" ";
		}
		cout << endl;
	}
	cout << endl;
}

int main()
{
	
	cin >> vnum >> arcnum;
	int i, j;

	//初始化邻接矩阵,用999表示没有边
	for (i = 0; i < vnum; i++)
	{
		for (j = 0; j < vnum; j++)
		{
			arc[i][j] = INT_MAX1;
		}
	}

	printArc();

	//输入各边
	while (arcnum--)
	{
		int weight;
		cin >> i >> j >> weight;
		arc[i][j] = weight;
	}

	printArc();

	int cost[100] = { 0 };//记录最小的代价
	int path[100] = { 0 };//记录路径,即经过的顶点

	//初始化
	for (i = 1; i < vnum; i++)
	{
		cost[i] = INT_MAX;
		path[i] = -1;
	}
	cost[0] = 0;
	path[0] = -1;

	//开始动态规划,找出最小代价
	for (j = 1; j < vnum; j++)
	{
		for (i = j - 1; i >= 0; i--)
		{
			if (cost[i] + arc[i][j] < cost[j])
			{
				cost[j] = cost[i] + arc[i][j];
				path[j] = i;
			}
		}
	}
	// 输出路径
	i = vnum - 1;
	cout << i;
	while (path[i] >= 0) { // 前一个点大于0 
		cout << "<-" << path[i];
		i = path[i]; // 更新为前一个点 
	}
	cout << endl;
	
	cout << "最短路径为:" << cost[vnum -1] << endl;
	system("pause");
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1295511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

因小失大,一个普通的postman多接口顺序执行,让项目瘫痪了一天

Runner的使用 postman不仅可以单独运行某个接口&#xff0c;postman的 Runner模块可以运行多个接口&#xff0c;可以实现真正意义上的自动化接口测试 Runner的主要功能如下 按顺序调用接口&#xff0c;执行用例&#xff1b; 批量发送请求&#xff1b; 对接口数据进行参数化…

Termux+Hexo结合内网穿透轻松实现安卓手机搭建博客网站发布公网访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

C++STL的string模拟实现

文章目录 前言string的成员变量成员函数构造函数拷贝构造赋值重载 模拟实现string各种接口print迭代器普通迭代器const迭代器 string比较大小push_backinsert 和 eraseinserterase reserve和resizereserveresize swapfindcout和cincoutcin 前言 今天要讲string的底层实现&…

c语言实例:计算并输出一个整数数组的平均值

大家好&#xff0c;今天给大家介绍一个c语言实例&#xff1a;计算并输出一个整数数组的平均值&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 以下是一个使用C语言实现的实例&am…

SMART PLC系统时间功能块

有时需要进行和系统时间相关的一些控制应用,所以PLC的系统时间对于此时的工程应用显得尤为重要。下面我们介绍系统时间功能块,这里的功能块我们可以对系统时间进行读取,还可以对系统时间进行修改。 1、系统时间 2、修改系统时间 功能块利用指针和指针运算完成系统时间读取和…

探索鸿蒙 TextInput组件

TextInput 根据组件名字&#xff0c;可以得知他是一个文本输出框。 声明代码&#x1f447; TextInput({placeholder?:ResourceStr,text?:ResourceStr}); placeholder: 就是提示文本&#xff0c;跟网页开发中的placeholder一样的 text&#xff1a;输入框当前的文本内容 特殊属…

人工智能从 DeepMind 到 ChatGPT ,从 2012 - 2024

本心、输入输出、结果 文章目录 人工智能从 DeepMind 到 ChatGPT &#xff0c;从 2012 - 2024前言2010年&#xff1a;DeepMind诞生2012&#xff5e;2013年&#xff1a;谷歌重视AI发展&#xff0c;“拿下”Hinton2013&#xff5e;2014年&#xff1a;谷歌收购DeepMind2013年&…

Linux常用命令——arpwatch命令

在线Linux命令查询工具 arpwatch 监听网络上ARP的记录 补充说明 arpwatch命令用来监听网络上arp的记录。 语法 arpwatch(选项)选项 -d&#xff1a;启动排错模式&#xff1b; -f<记录文件>&#xff1a;设置存储ARP记录的文件&#xff0c;预设为/var/arpwatch/arp.d…

IOday6作业

1>使用有名管道&#xff0c;完成两个进程的相互通信 //create.c #include<myhead.h>int main(int argc, const char *argv[]) {if((mkfifo("myfifo1",0664)) -1){perror("mkfifo");return -1;}if((mkfifo("myfifo2",0664)) -1){perror…

MySQL 教程 2.1

MySQL 插入数据 MySQL 表中使用 INSERT INTO 语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据&#xff0c;或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法&#xff1a; INSERT INTO table_name (colu…

Vue 核心 数据监听 computed | watch

Vue 核心 数据监听 computed | watch 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&…

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…

一个不错的文章伪原创系统程序源码

一款文章伪原创系统程序源码免费分享&#xff0c;程序是站长原创的。 一共花了站长几天时间写的这个文章伪原创平台&#xff0c;程序无需数据库。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生书写。 前端伪原创采用Ajax无刷新提交&#xff0c;Ajax转换到词库…

时域频域(学习记录1)

1 小伙伴们&#xff0c;今天让我们一起来聊聊Something about DATA 系列。我们先回顾一下本系列对NVH测试中的数据采集做的整体介绍&#xff1a; A 数据采集过程&#xff1b; B 硬件设备&#xff1b; C 数采软件&#xff1b; D ATOM中的数据采集&#xff1b; 接下来的几篇文章…

zotero关闭翻译自动创建标签

zotero中文社区&#xff1a;https://plugins.zotero-chinese.com/#/

代码去除注释Remove Comments、合并行Join Lines、代码压缩Minify等vscode功能

1. 去除注释 通过vscode商店扩展 Remove Comments 移除注释。 Just copy-pasted some code from somewhere and it’s obscenely documented with unnecessary comments everywhere? Remove Comments will help you undocument the code and remove all the comments present…

AUTOSAR CP Int-Watchdog简介

Int Watchdog 1 简介2 EB 中配置 TC39X3 Wdg 在代码中使用1 简介 内部看门狗驱动[sws_Wdg_00161]要访问内部看门狗硬件,对应的 Wdg 模块实例应该直接访问看门狗服务的硬件。提示:内部看门狗驱动程序是微控制器抽象层的一部分,它允许直接的硬件访问。注意:内部看门狗的日常服…

unity3d摄像机和观察对象坐标轴修正

让摄像机与观察对象在场景层级并列&#xff0c;以世界坐标看齐 &#xff0c;在local模式&#xff0c;只调整模型或者摄像机方向

超越GPT4.0,5分钟介绍谷歌Gemini最新功能,以及登录体验

上段时间还在吃OpenAI后宫争斗戏的瓜&#xff0c;今天又迎来了AI圈子地震的大事件&#xff0c;因为号称GPT4.0强劲对手的Google-Gemini正式发布啦&#xff01;作为新一代多模态AI模型&#xff0c;以强大的性能和广泛的应用前景吸引了全球AI圈友们的关注。 AI进化速度真的太快了…

计算机方向的一些重要缩写和简介

参考&#xff1a; 深度学习四大类网络模型 干货|机器学习超全综述&#xff01; 机器学习ML、卷积神经网络CNN、循环神经网络RNN、马尔可夫蒙特卡罗MCMC、生成对抗网络GAN、图神经网络GNN——人工智能经典算法 MLP&#xff08;Multi Layer Perseption&#xff09;用在神经网络中…