15-1有向无环图中的最长路径

  1. #ifndef LONG_PATH_H
  2. #define LONG_PATH_H
  3. #include<iostream>
  4. #include<string>
  5. #define MAX 65535
  6. int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin );
  7. void printf_path(int origin,int destin);
  8. #endif
  1. #include"LongPath.h"
  2. #define Max(a,b) a>b? a:b
  3. int pathStore[20];
  4. int graphPath_longest(int (*Graph)[5],int Length,int origin,int destin){
  5. int pathLength=-1;
  6. for(int i=0;i<Length; i++){
  7. if(Graph[origin][i]!=0&&Graph[origin][i]!=MAX&&origin!=destin){
  8. if(graphPath_longest(Graph,Length,i,destin)+Graph[origin][i]>pathLength){
  9. pathLength=graphPath_longest(Graph,Length,i,destin)+Graph[origin][i];
  10. pathStore[origin]=i;
  11. }
  12. }
  13. else if(origin==destin){
  14. pathStore[origin]=destin;
  15. pathLength=Max(0,pathLength);
  16. }
  17. }
  18. return pathLength;
  19. }
  20. void printf_path(int origin,int destin){
  21. int n=origin;
  22. std::cout<<"the longest path in Graph from node "<<origin<<" to node "<<destin<<std::endl;
  23. std::cout<<origin;
  24. while(n!=destin){
  25. n=pathStore[n];
  26. std::cout<<"->"<<n;
  27. }
  28. std::cout<<std::endl;
  29. }
  1. #include "LongPath.h"
  2. int main(){
  3. int Graph[5][5]={MAX};
  4. Graph[0][0]=0;
  5. Graph[0][4]=6;
  6. Graph[1][0]=9;
  7. Graph[1][1]=0;
  8. Graph[1][2]=3;
  9. Graph[2][0]=10;
  10. Graph[2][2]=0;
  11. Graph[2][3]=5;
  12. Graph[3][3]=0;
  13. Graph[3][4]=1;
  14. Graph[4][4]=0;
  15. std::cout<<"The longest path value "<<graphPath_longest(Graph,5,1,4)<<std::endl;
  16. printf_path(1,4);
  17. }

注:

本题中,我采用的解法还是使用了一般的解法思想,在该题中,我们还是采用的是固定一端不动,另一端进行优化的思想。

也就是说,

if(graphPath_longest(Graph,Length,i,destin)+Graph[origin][i]>pathLength){

pathLength=graphPath_longest(Graph,Length,i,destin)+Graph[origin][i];

pathStore[origin]=i;

}

?题中的destin一直都没有改变呢。

于是在记录优化路径时,我们只用了一维数组来解决问题,因为在每次迭代中变的只有那个origin,只要记录每次的origin就可以了

pathStore[origin]=i

?每次的迭代都会求得一个最理想的i,从而我们只要记录这个理想的i就可以了。

而且下次的origin正好是这次的i,这样就循环套在一起了。

std::cout<<origin;

while(n!=destin){

n=pathStore[n];

std::cout<<"->"<<n;

}

上面的代码就是循环输出的。

来自为知笔记(Wiz)

时间: 2024-12-24 07:15:38

15-1有向无环图中的最长路径的相关文章

javascript实现有向无环图中任意两点最短路径的dijistra算法

有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijk

HDU 3249 Test for job (有向无环图上的最长路,DP)

 解题思路: 求有向无环图上的最长路,简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define LL long long using namespace std; const int

有向无环图的最小路径覆盖 二分图模型解题

有向无环图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次). 最小路径覆盖就是找出最小的路径条数,使之成为原图的一个路径覆盖. 公式:最小路径覆盖=(原图)顶点数-对应的二分图的最大匹配数. 我们通过例题来解释如何把DAG转换为二分图模型. HDU1151Air Raid 题目大意:在一个城镇,有n个路口,和m条单向路,而且这些路不会形成环.现在要弄

JavaScript + SVG实现Web前端WorkFlow工作流DAG有向无环图

一.效果图展示及说明 (图一) (图二) 附注说明: 1. 图例都是DAG有向无环图的展现效果.两张图的区别为第二张图包含了多个分段关系.放置展示图片效果主要是为了说明该例子支持多段关系的展现(当前也包括单独的节点展现,图例没有展示) 2.图例中的圆形和曲线均使用的是SVG绘制.之前考虑了三种方式,一种是html5的canvas,一种是原始的html DOM,再有就是SVG.不过canvas对事件的支持不是很好(记得之前看过一篇文章主要是通过计算鼠标定位是否在canvas上的某个区域来触发事件机

有向无环图的最短路径

我们已经知道了如何通过Dijkstra算法在非负权图中找到最短路径.即使图中有负权边,我们也知道通过Bellman-Ford算法找到一个从 给定的源点到其它所有节点的最短路径.现在我们将看到一个在线性时间内运行得更快的算法,它可以在有向无环图中找到从一个给定的源点到其它所有可达顶点的 最短路径,又名有向无环图(DAG). 由于有向无环图无环所以我们不必担心负环的问题.正如我们已经知道在负环里讨论最短路径是毫无意义的一样,因为我们可以在这些环里不断“循环”,但实际上我们得到的路径将变得越来越短(构

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

[转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图

MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今天阿信带大家一起来探究什么是MerkleDAG,拆分解说Merkle Tree.DAG有向无环图.MerkleDAG在IPFS中的应用. MerkleDAG树形结构图 Merkle Tree Merkle Tree是由美国计算机学家Merkle于1979年申请的专利. Merkle Tree通常也被

图-&gt;有向无环图-&gt;拓扑排序

文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图的应用.假如有一个表达式: ((a+b)*(b*(c+d))+(c+d)*e)*((c+d)*e), 可以用之前讨论的二叉树来表示,也可以用有向无环图来表示,如下图.显然有向无环图实现了对相同子式的共享,从而比二叉树更节省空间. 关于拓扑排序的基础定义: 由某个集合上的一个偏序得到该集合上的一个全须

UVA10305 Ordering Tasks(有向无环图排序--toposort) Kahn算法

题目描述:https://vjudge.net/problem/UVA-10305 题目分析: 恨水的题目,只要学了toposort就会做的,大概意思是给你n个变量,m个不等关系表示a<b,问n个数可能的关系;不如举个例子例如n=3表示3个变量我们假如他们是a,b,c现在有两个关系a<b,a<c 那么输出有两种a<b<c或者a<c<b(题目要求输出任意一种); 题目大概就这个意思,那么我们怎么做呢,我们想一想如果把变量看成点,关系看成有向边,那么就得到一个图,这个