多段图最短路径

本文介绍了一种解决多段图最短路径问题的算法,首先阐述问题定义,接着说明输入输出格式,并给出样例输入及对应输出。问题通过分解成多个子问题,采用自底向上的方式逐步求解,从源节点到每一段的顶点集求最短路径,最终得到从源到汇的最小权重值。文章还提供了算法的思路和程序实现概述。
摘要由CSDN通过智能技术生成

问题描述:
设是一个赋权有向图,其顶点集V被划分为个不相交的子集,其中,V1和Vk分别只有一个顶点s(称为源)和一个顶点t(称为汇),所有的边(u,v)的始点和终点都在相邻的两个子集Vi和Vi+1中:, 且边(u,v)有一个正权重,记为.请设计一个算法,求解从源s到汇t的权重之和最小的路径。
**输入:**包含多组测试数据。每组测试数据第一行输入正整数k(k<100), 表示不相交子集的数目。第二行包含k个正整数ni(1<=i<=k),分别表示每一个顶点集Vi(1<=i<=k)中顶点的数目(不超过100)。紧接着k-1行记录相邻顶点集合间边的权重。其第i(1<=i<k)行包含niXni+1个数,表示顶点集Vi和Vi+1之间的边的权重(-1表示没有边相连),权重矩阵按行排列,也就是Vi中第p(1<=p<ni)个顶点和Vj中第q(1<=q<ni)个顶点之间的权重对应行第(p-1)Xnj+q和位置的值。最后一行输入-1,表示输入结束。
**输出:**每组测试数据的结果输出占一行,输出其最小的权重值。

样例输入:

5

1 4 3 3 1

9 7 3 2

4 2 1 2 7 -1 -1 -1 11 -1 11 8

6 5 -1 4 3 -1 -1 5 6

4 2 5

-1
样例输出:
16

问题解析:
包含源节点s的子图对应一个子问题,子图的源是固定的,汇是变化的。因此,确定了汇的位置,则能确定一个子图。汇的位置包含两个参数:
1.短的序号
2.汇顶点在段中的序号
在这里插入图片描述
在这里插入图片描述
子问题的数目等于图中顶点的个数。
采用自底向上(由易至难)的方法求最优解:

  • 最开始求解源S到第二段顶点集中每一个顶点的最短路径,最简单。
  • 然后求解s到第三段顶点集中的每一个顶点的最优值。
  • 依次循环,直至求解s到t的最短路径值。
    在这里插入图片描述

程序如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MaxState 100 
using 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值