精华内容
下载资源
问答
  • 就是在这样的去寻找V1到V5的最短路径。 那么思路是什么? 明确目标: V1到V5 并且是一个可通 路径长度最短 这样一来思路就很清晰。设立数组value[]来表示对应到12个端点的最值。value[i]表示由0-i 的最短路径。...

    多端图的描述其实就是有向图。对应的算法书这块,大家可以在学习算法时就会接触到关于最短路径的求解。
    例图:
    在这里插入图片描述
    就是在这样的图去寻找V1到V5的最短路径。
    那么思路是什么?
    明确目标:

    • V1到V5
    • 并且是一个可通图
    • 路径长度最短
      这样一来思路就很清晰。设立数组value[]来表示对应到12个端点的最值。value[i]表示由0-i 的最短路径。
      对应的代码:
      public static int []value;
    	public static int fun(int[][] arr, int a) {
    		value = new int[arr.length];
    		Arrays.fill(value, Integer.MAX_VALUE);
    		int[] parent = new int[arr.length];
    		Arrays.fill(parent, -1);
    		value[0]=0;
    		parent[0]=-1;
    		for (int j = 1; j < arr.length; j++) {
    			for (int i = j - 1; i >= 0; i--) {
    				if (arr[i][j] != a) {
    					int d = value[i] + arr[i][j];
    					if (d < value[j]) {
    						value[j] = d;
    						parent[j] = i;
    					}
    				}
    			}
    		}
    		return value[arr.length - 1];
    	}
    

    用例:

    public static void main(String[] args) {
    		int a = Integer.MAX_VALUE;
    		int[][] arr = new int[][] { { a, 2, 3, 1, a }, { a, a, a, a, 5 }, { a, a, a, a, 3 }, { a, a, a, a, 7 },
    				{ a, a, a, a, a } };
    		System.out.println(fun(arr, a));
    		for(int i=0;i<value.length;i++) {
    			System.out.print(value[i]+" ");
    		}
    
    	}
    

    用例图解:
    在这里插入图片描述

    展开全文
  • 课程的随堂作业,C语言的,用dev就能运行,萌新代码,勿喷,仅仅帮助不想写作业的朋友方便一下,反正老师也不会仔细检查的
  • 本文实例讲述了Python基于Floyd算法求解最短路径距离问题。分享给大家供大家参考,具体如下: Floyd算法和Dijkstra算法,相信大家都不陌生,在最短路径距离的求解中应该算得上是最为基础和经典的两个算法了,今天就...
  • 动态规划——多段图最短路径

    千次阅读 2020-04-15 09:11:46
    问题描述 源码 #include<stdio.h> #include<stdlib.h>...//的最大结点数为100 int arc[N][N];//的代价矩阵 int cost[N];//存储路径长度 int path[N];//路径 int ClosetPath(int n) { i...

    问题描述

    在这里插入图片描述
    在这里插入图片描述

    源码

    #include<stdio.h>
    #include<stdlib.h>
    const int INF = 1000;
    const int N = 100;//图的最大结点数为100
    int arc[N][N];//图的代价矩阵
    int cost[N];//存储路径长度
    int path[N];//路径
    int ClosetPath(int n) {
     int i,j,temp;
     for(i=1; i<n; i++) {
      cost[i]=INF;
      path[i]=-1;
     }
     cost[0]=0;
     path[0]=-1;//起点
     for(j=1; j<n; j++) {
      for(i=j-1; i>=0; i--) {
       if(arc[i][j]+cost[i]<cost[j]) {
        cost[j]=arc[i][j]+cost[i];
        path[j]=i;
       }
      }
     }
     return cost[n-1];
    }
    void printPath(int i) {
     if(i!=-1) {
      printPath(path[i]);
      printf("%d-",i);
     }
    }
    int main() {
     int i,j,n,m;
     //printf("请输入结点个数和边个数:");
     //scanf("%d%d",&n,&m);
     n=10;
     m=18;
     for(i=0; i<n; i++)
      for(j=0; j<n; j++)
       arc[i][j]=INF;
    // for(i=0;i<m;i++){
    //  int a,b,c;
    //  printf("请输入边的两个顶点计权重:");
    //  scanf("%d%d%d",&a,&b,&c);
    //  arc[a][b]=c;
    // }
     arc[0][1]=4;
     arc[0][2]=2;
     arc[0][3]=3;
     arc[1][4]=9;
     arc[1][5]=8;
     arc[2][4]=6;
     arc[2][5]=7;
     arc[2][6]=8;
     arc[3][5]=4;
     arc[3][6]=7;
     arc[4][7]=5;
     arc[4][8]=6;
     arc[5][7]=8;
     arc[5][8]=6;
     arc[6][7]=6;
     arc[6][8]=5;
     arc[7][9]=7;
     arc[8][9]=3;
     int min = ClosetPath(n);
     for(i=0;i<n;i++)
      printf("%3d",path[i]);
     printf("\n最短路径为:");
     printPath(path[n-1]);
     printf("%d",n-1);
     printf("\n最短距离:%d",min);
     return 0;
    }
    
    展开全文
  • 多段图最短路径问题问题:设G=(V,E)是一个带权有向,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k),使得E中的任何一条边,必有u∈Vi,v∈Vi+m(1<=it∈Vk为终点。多段图最短路径...

    多段图的最短路径问题

    问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k),

    使得E中的任何一条边,必有u∈Vi, v∈Vi+m(1<=i

    t∈Vk为终点。

    多段图的最短路径问题为从源点到终点的最小代价路径。

    11709da35245b5ce98945857f0df7c5c.png

    子问题:设Cuv表示多段图的有向边上的权值,将从源点s到终点t的最短路径长度即为d(s,t),

    考虑原问题的部分解d(s,v),显然有下式成立

    d(s,v)=Csu   (∈E)

    d(s,v)=min(d(s,u)+Cuv)            (∈E)

    算法:多段图的最短路径问题

    输入:多段图的代价矩阵

    输出:最短长度及路径c[n][n]

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

    1.1考察顶点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]

    #include#include#include

    #define Max 0xffff

    using namespacestd;//动态规划求最短路径

    void dp_path(int c[][100], int *cost, int *path) {intm, n;

    cout<< "输入顶点个数和边个数" <

    cin>> n >>m;//初始化代价矩阵

    for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)

    c[i][j]=Max;//输入代价矩阵

    intu, v, s;for (int i = 0; i < m; i++) {

    cin>> u >> v >>s;//cout<

    c[u][v] =s;

    }for(int i=0;i

    cost[i]=Max;

    path[0] = -1;

    cost[0] = 0;for (int j = 1; j < n; j++) {for (int i = j-1; i >=0; i--) {if (cost[j] > cost[i] +c[i][j]) {

    path[j]=i;

    cost[j]= cost[i] +c[i][j];

    }

    }

    }

    cout<

    cout<=0){

    cout<

    i=path[i];

    }

    }intmain()

    {int c[100][100], cost[100], path[100];

    dp_path(c, cost, path);

    getchar();return 0;

    }

    展开全文
  • #include //#define LEN sizeof(struct NODE) #define N 10 #define MAX_TYPE 10000 #define ZERO_TYPE 0 /*定义的邻接链表*/ struct NODE /*邻接表.../*在阶段决策中,各个顶点到收点的最短路径上的前方顶点编号*/
  • 动态规划--多段图最短路径

    万次阅读 2017-10-29 12:50:17
    问题描述:设是一个赋权有向,其顶点集V被划分为个不相交的子集,其中,V1和Vk分别只有一个顶点s(称为源)和一个顶点t(称为汇),所有的边(u,v)的始点和终点都在相邻的两个子集Vi和Vi+1中:, 且边(u,v)有一个正...

    问题描述:设是一个赋权有向图,其顶点集V被划分为个不相交的子集,其中,V1和Vk分别只有一个顶点s(称为源)和一个顶点t(称为汇),所有的边(u,v)的始点和终点都在相邻的两个子集Vi和Vi+1中:, 且边(u,v)有一个正权重,记为.请设计一个算法,求解从源s到汇t的权重之和最小的路径。


    状态表示

    包含源s的子图都可以认为是一个子问题,子图的源是固定的,汇是可以变化的。因此,确定了汇的位置,则能确定一个子图。汇的位置包括两个参数:段的序号和该段顶点集合中汇顶点的序号。

    W(i,p)表示从源s 到v(i,p) 的最短路径长度

    ui(1≤i≤k)表示段的序号
    up(1≤p≤n_i)表示第 i 段顶点集中的顶点序号


    状态递推方程


    最优值求解

    u子问题的数目等于图G中 顶点的个数。
    u采用 自底向上的方法求最优值,最开始求解源s到第2段顶点集中每一个顶点的最短路径。这是最简单的子问题,最优值就等于边长。

    然后求解s到第3段顶点集中的每一个顶点的最优值,依此循环,直至求解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

    程序如下:

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. #define MaxState 100  
    5.   
    6. int minRoad[MaxState][MaxState];  
    7. void multiStageGraph(int stageNum, int *numPerStage);  
    8.   
    9. int main()  
    10. {  
    11.     int i, k, ni[MaxState];  
    12.     while(scanf(“%d”, &k),k != -1)  
    13.     {  
    14.         for(i = 0; i < k; ++i)  
    15.         {  
    16.             scanf(”%d”, &ni[i]);  
    17.         }  
    18.         multiStageGraph(k, ni);  
    19.     }  
    20.     return 0;  
    21. }  
    22.   
    23. void multiStageGraph(int stageNum, int *numPerStage)  
    24. {  
    25.     int i, q, p, weight, temp;  
    26.     memset(minRoad, 0x3f, sizeof(minRoad));           //初始化为一个充分大的数0x3f  
    27.   
    28.     for (p = 0; p < numPerStage[0]; ++p)              //初始化源顶点层  
    29.     {  
    30.         minRoad[0][p] = 0;  
    31.     }  
    32.   
    33.     for (i = 0; i < stageNum - 1; ++i)                //按段计算,终止与汇顶点的前一段  
    34.     {  
    35.         for (q = 0; q < numPerStage[i]; ++q)          //遍历第i段顶点  
    36.         {  
    37.             for (p = 0; p < numPerStage[i + 1]; ++p)  //遍历第i+1段顶点  
    38.             {  
    39.                 scanf(”%d”, &weight);                 //读取边(q,p)的权重w(q,p)  
    40.                 if (weight != -1)                     //存在边(q,p)  
    41.                 {  
    42.                     temp = minRoad[i][q] + weight;  
    43.                     if (temp < minRoad[i+1][p])       //发现s到o的更短路径  
    44.                     {  
    45.                         minRoad[i+1][p] = temp;  
    46.                     }  
    47.                 }  
    48.             }  
    49.         }  
    50.     }  
    51.     printf(”%d\n”, minRoad[stageNum-1][0]);  
    52. }  
    #include <stdio.h>
    
    
    
    
    
    #include <stdlib.h> #define MaxState 100 int minRoad[MaxState][MaxState]; void multiStageGraph(int stageNum, int *numPerStage); int main() { int i, k, ni[MaxState]; while(scanf("%d", &k),k != -1) { for(i = 0; i < k; ++i) { scanf("%d", &ni[i]); } multiStageGraph(k, ni); } return 0; } void multiStageGraph(int stageNum, int *numPerStage) { int i, q, p, weight, temp; memset(minRoad, 0x3f, sizeof(minRoad)); //初始化为一个充分大的数0x3f for (p = 0; p < numPerStage[0]; ++p) //初始化源顶点层 { minRoad[0][p] = 0; } for (i = 0; i < stageNum - 1; ++i) //按段计算,终止与汇顶点的前一段 { for (q = 0; q < numPerStage[i]; ++q) //遍历第i段顶点 { for (p = 0; p < numPerStage[i + 1]; ++p) //遍历第i+1段顶点 { scanf("%d", &weight); //读取边(q,p)的权重w(q,p) if (weight != -1) //存在边(q,p) { temp = minRoad[i][q] + weight; if (temp < minRoad[i+1][p]) //发现s到o的更短路径 { minRoad[i+1][p] = temp; } } } } } printf("%d\n", minRoad[stageNum-1][0]); }




    展开全文
  • 关于动态规划最短路径求解的matlab学习例子
  • 算法-动态规划2-多段图最短路径问题 多段图最短路径问题 问题:设G=(V,E)是一个带权有向,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k),使得E中的任何一条边<u,v>,必...
  • 建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径。 思路 首先确定能分段,即每一层的各个结点互不连通,后驱结点均在同一层。 通过有一定修改的bfs进行分段...
  • 动态规划求解多段图最短路径

    千次阅读 2021-01-06 22:34:58
    动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 #define INF 0x3f3f3f int graph[100][100];//的链接矩阵 ...
  • 时间复杂度为O(m+k):m为边的数目,k为的数目。 #include<iostream> using namespace std; #define INF 999 int arc[100][100]; // 最多100个点 int CreateGraph() { int vnum,arcnum; cout<<"请...
  • 动态规划最短路径

    千次阅读 2020-12-20 13:20:33
    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1...
  • 完整代码,可直接运行
  • 课程的随堂作业,C语言的,用dev就能运行,萌新代码,勿喷,仅仅帮助不想写作业的朋友方便一下,反正老师也不会仔细检查的
  • [算法]多段图最短路径 多段图最短路径问题是应用动态规划的经典问题之一,许多优化问题都能转化为多段图最短路径问题进而求解。多段图最短...
  • 一、问题描述 二、求解分析 三、源码
  • 多段图最短路径问题 多段图最短路径问题
  • 重点掌握:动态规划法求解每对结点之间的最短路径、0/1背包问题。 如果求任意两点之间的最短路径,两点之间可以直接到达但却不是最短的路径,要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点...
  • 问题描述:用动态规划法求解如所示多段图中从顶点0到9的最短路径
  • 动态规划多段图最短路径问题,希望大家下载给我加点分啦。希望大家下载给我加点分啦。希望大家下载给我加点分啦。 (C语言源程序),
  • 动态规划思想解决最短路径问题java语言实现
  • 完整代码,可直接运行
  • 在本篇内容里小编给大家整理的是关于python实现最短路径的实例方法,有需要的朋友们可以参考下。
  • 最短路径问题是 动态规划的一个实例。1.最短路径问题的描述2.举个例子来说明:求从 S 到 T 的最短路径。3.思考方式4.利用动态规划求解问题依次 考虑从 C 到 T 的最短距离。考虑从 B 到 C 的最短距离考虑从 A 到 B 的...
  • c语言实现的动态规划最短路径长度,注意看代码中的注释。
  • 动态规划解决最短路径问题

    千次阅读 2020-08-15 16:00:30
    3.6 最短路径 3.6.1 问题描述 最短路径问题(Shortest path ...A到C2的最短路径,我们可以看出,B1和B2都可以到达C2,其中经过B1的最短路径为4+3=7,经过B2的最短路径为5+8=13,所以A到C2的最短路径为7,前序节点为
  • 已知有两辆车,需从配送中心到8个不同地方,配送中心与目标间的距离不同,且需求也不一样,利用遗传算法求解最短路径

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,714
精华内容 80,685
关键字:

多段图的最短路径动态规划