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

一、多段图问题

问题描述:设图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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【带头学C++】----- 九、类和对象 ---- 9.4 拷贝构造函数、赋值

目录 9.4 拷贝构造函数、赋值 9.4.1 定义拷贝构造函数 9.4.2 拷贝构造和无参构造、有参构造的关系 9.4.3 拷贝构造的几种调用形式 1、旧对象给新对象初始化&#xff0c;调用拷贝构造 2、给对象取别名不会调用拷贝构造 3、普通对象作为函数参数&#xff0c;调用函数时会发…

【Java用法】Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 + 数据排序

Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 数据排序 一、业务场景二、Hutool官网树结构工具2.1 介绍2.2 使用2.2.1 定义结构2.2.2 构建Tree2.2.3 自定义字段名 2.3 说明 三、具体的使用场景3.1 实现的效果3.2 业务代码3.3 实现自定义字段的排序 四、踩过的坑4.1 坑…

中伟视界:皮带跑偏、异物检测AI算法除了矿山行业应用,还能在钢铁、火电、港口等行业中使用吗?

随着工业化的发展&#xff0c;皮带输送机已经成为各行业中不可或缺的重要设备&#xff0c;但是在使用过程中&#xff0c;由于各种原因&#xff0c;皮带常常出现跑偏问题&#xff0c;给生产运营带来了诸多困扰。不仅仅是矿山行业&#xff0c;钢铁、火电、港口等行业也都面临着皮…

英文论文查重复率网址

大家好&#xff0c;今天来聊聊英文论文查重复率网址&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 英文论文查重复率网址 在撰写英文论文时&#xff0c;查重是确保论文原创性和质量的重要环节快码论文…

LeetCode Hot100 131.分割回文串

题目&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 方法&#xff1a;灵神-子集型回溯 假设每对相邻字符之间有个逗号&#xff0c;那么就看…

windows11 windows 11 (win11 win 11) 怎么安装 Python3 ? numpy? sounddevice? 声音信号处理库?

首先确认要安装的 sounddevice 库&#xff0c;链接&#xff1a;https://python-sounddevice.readthedocs.io/en/0.4.6/ 根据文档&#xff0c;可知最新的 sounddevice 版本是 0.4.6 进入安装页面查看&#xff0c;发现 Newest sounddevice 可以使用 pip 安装&#xff0c;如下图…

AGM离线下载器使用说明

AGM专用离线下载器示意图&#xff1a; 供电方式&#xff1a; 通过 USB 接口给下载器供电&#xff0c;跳线 JP 断开。如果客户 PCB 的 JTAG 口不能提供 3.3V 电源&#xff0c;或仅需烧写下载器&#xff0c;尚未连接用户 PCB 时&#xff0c;采用此种方式供电。 或者&#xff1a…

私域运营:12个朋友圈经营模板

做私域运营的各位&#xff0c;想必大家都会烦恼朋友圈要发什么才能保证最高效吧&#xff01; 首先&#xff0c;我们需要明确&#xff0c;朋友圈是什么&#xff1f; 朋友圈是我们打造信任感的地方&#xff0c;也是我们的信息能够及时触达用户的重要渠道。很多人都有一个习惯&a…

线性代数基础【1】行列式

第一节 行列式的基本概念和性质 一、基本概念 ①逆序 1,2和2,1是一对逆序 ②逆序数 1,2,3,5,4的逆序数为1;1,3,2,5,4逆序数为4; ③行列式 ④余子数和代数余子数 行列式挖掉一个数(例如aij),将原行列式去掉i行j列的行列式M,则M为余子数,代数余子数记为Aij,如果(ij)为偶数…

leaflet:经纬度坐标转为地址,点击鼠标显示地址信息(137)

第137个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中将经纬度坐标转化为地址,点击鼠标显示某地的地址信息 。主要利用mapbox的api将坐标转化为地址,然后在固定的位置显示出来。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示…

既然UDP更快,为啥这么多年一直用TCP ?

你们好啊&#xff0c;我是老杨。 有点基本技术常识的粉丝朋友都知道&#xff0c;UDP肯定是比TCP快的。 很多人对TCP和UDP的了解很浅&#xff0c;直到自己真的经历了一些通信项目之后&#xff0c;你才会愿意根据实际情况埋头苦学&#xff0c;企图“速成”一下。 要是问你为什…

复杂gRPC之go调用go

1. 复杂的gRPC调用 我们使用了一个较为复杂的proto文件&#xff0c;这个文件的功能主要是用来定位的&#xff0c;详细内容可以看代码中的注解 syntax "proto3"; //指定生成的所属的package&#xff0c;方便调用 option go_package "./"; package route…

KaiwuDB 通过中国信通院“可信数据库”性能与稳定性评测

11月29日&#xff0c;中国信通院 2023 年下半年“可信数据库”评估评测结果正式发布&#xff0c;由 KaiwuDB研发的开务数据库系统 KaiwuDB V2.0 达到信通院时序数据库性能、稳定性测试标准。 至此&#xff0c;KaiwuDB已完成时序数据库基础能力、性能、稳定性全项评测&#xff…

Python Tacacs故障诊断记录

背景&#xff1a;客户现场说我们的设备在3A鉴权时失败&#xff0c;没有认证成功 第一步&#xff0c;先看下我们log 没有明显的错误记录&#xff0c;貌似认证成功了但是确提示认证失败&#xff0c;有点迷 第二步&#xff0c;家里搭建和现场一致的环境&#xff0c;模拟登录发现是…

《文存阅刊》期刊发表简介

《文存阅刊》以“深研文化创新&#xff0c;崇尚科学真理&#xff0c;坚持双百方针&#xff0c;打造学术精品”为办刊宗旨&#xff0c;涵盖艺术、文学、社科等多项内容&#xff0c;适应了文化市场需求&#xff0c;很好的回应了广大文化理论工作者的关切&#xff0c;为下一步打造…

cuda lib 线程安全的要义

1, 概述 cuda lib 线程安全的几个多线程的情景&#xff1a; 单卡多线程&#xff1b; 多卡多线程-每卡单线程&#xff1b; 多卡多线程-每卡多线程&#xff1b; 需要考虑的问题&#xff1a; 每个 cublasHandle_t 只能有一个stream么&#xff1f; 每个cusolverHandle_t 只能有一…

DTS认证

一、什么叫DTS DTS 是“Digital Theatre System“的缩写&#xff0c;是”数字化影院系统“的意思。是一种音频格式&#xff0c;从技术上讲&#xff0c;把音效数据存储到另外的CD-ROM中&#xff0c;使其与影像数据同步。这样不但空间得到增加&#xff0c;而且数据流量也可以相对…

如何运用gpt改写出高质量的文章 (1)

大家好&#xff0c;今天来聊聊如何运用gpt改写出高质量的文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 如何运用GPT改写出高质量的文章 一、引言 随着人工智能技术的飞速发展&#xff0c;自然…

HHDESK右键管理简介

在HHDESK管理文件&#xff0c;除了基本的打开、删除、复制、粘贴、重命名外&#xff0c;还有多种便捷编辑方式。 可以分别以下列模式打开文档&#xff1a; 文本模式即是以文本编辑器打开文档。 1 二进制模式 可进行二进制编辑。 2 JSON模式 可对JSON文件进行直观的解析…

b样条原理与测试

为了保留贝塞尔曲线的优点&#xff0c;同时克服贝塞尔曲线的缺点&#xff0c;b样条在贝塞尔曲线上发展而来&#xff0c;首先来看贝塞尔曲线的定义&#xff1a; 对于贝塞尔中的基函数而言&#xff0c;是确定的&#xff0c;全局唯一的&#xff0c;这导致了如果控制点发生变换将会…