Expm 4_2 有向无环图中的最短路径问题
【问题描述】
建立一个从源点S到终点E的有向无环图,设计一个动态规划算法求出从S到E的最短路径值,并输出相应的最短路径。

解:

package org.xiu68.exp.exp4; import java.util.ArrayDeque;
import java.util.Stack; public class Exp4_2 {
//建立一个从源点S到终点E的有向无环图,设计一个动态规划算法求出从S到E的最短路径值,并输出相应的最短路径。
public static void main(String[] args) {
int m=Integer.MAX_VALUE;
int[][] edges=new int[][]{
{m,1,m,2,m,m},
{m,m,6,m,m,m},
{m,m,m,m,1,2},
{m,4,m,m,3,m},
{m,m,m,m,m,1},
{m,m,m,m,m,m}
};
MGraph1 m1=new MGraph1(edges);
m1.minPath(0, 5);
//输出
// 0 to 5 is 6
// the path is:0-->3-->4-->5 }
} class MGraph1{
private int[][] edges; //有向无环图
private int vexNum; //顶点数量 public MGraph1(int[][] edges){
this.edges=edges;
this.vexNum=edges.length;
} public void minPath(int start,int end){ int[] dist=new int[vexNum]; //源点到该点的最短路径
for(int i=0;i<vexNum;i++)
dist[i]=Integer.MAX_VALUE;
dist[start]=0; int[] pre=new int[vexNum]; //最短路径中该点的前一个顶点
pre[start]=-1; Stack<Integer> queue=new Stack<>(); //存放拓扑排序序列
topoSort(queue); while(!queue.isEmpty()){
int j=queue.pop(); for(int i=0;i<vexNum;i++){
if(edges[i][j]!=Integer.MAX_VALUE && dist[j]>dist[i]+edges[i][j]){
dist[j]=dist[i]+edges[i][j];
pre[j]=i;
}
}//for
}//while //打印最短路径
System.out.println(start+" to "+end+" is "+dist[end]); String path=""+end;
int preVex=pre[end]; while(preVex!=-1){
path=preVex+"-->"+path;
preVex=pre[preVex];
}
System.out.println("the path is:"+path); } //拓扑排序
public void topoSort(Stack<Integer> queue){
boolean[] visited=new boolean[vexNum];
for(int i=0;i<vexNum;i++){
if(!visited[i])
dfs(queue,i,visited);
}
} //利用深度优先搜索进行拓扑排序
public void dfs(Stack<Integer> queue,int v,boolean[] visited){
visited[v]=true;
for(int i=0;i<vexNum;i++){
if(edges[v][i]!=Integer.MAX_VALUE && !visited[i])
dfs(queue,i,visited);
}
queue.push(v);
}
}
Expm 4_2 有向无环图中的最短路径问题的更多相关文章
- javascript实现有向无环图中任意两点最短路径的dijistra算法
有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...
- pagerank算法在数学模型中的运用(有向无环图中节点排序)
一.模型介绍 pagerank算法主要是根据网页中被链接数用来给网页进行重要性排名. 1.1模型解释 模型核心: a. 如果多个网页指向某个网页A,则网页A的排名较高. b. 如果排名高A的网页指向某 ...
- JavaScript + SVG实现Web前端WorkFlow工作流DAG有向无环图
一.效果图展示及说明 (图一) (图二) 附注说明: 1. 图例都是DAG有向无环图的展现效果.两张图的区别为第二张图包含了多个分段关系.放置展示图片效果主要是为了说明该例子支持多段关系的展现(当前也 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)
一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...
- 算法精解:DAG有向无环图
DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...
- c/c++ 有向无环图 directed acycline graph
c/c++ 有向无环图 directed acycline graph 概念: 图中点与点之间的线是有方向的,图中不存在环.用邻接表的方式,实现的图. 名词: 顶点的入度:到这个顶点的线的数量. 顶点 ...
- 图->有向无环图->求关键路径
文字描述 与AOV-网相对应的是AOE-网(Activity on Edge)即边表示活动的网.AOE-网是一个带权的有向无环图.其中,顶点表示事件Event,弧表示活动,权表示活动持续的时间.通常, ...
- 图->有向无环图->拓扑排序
文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图 ...
随机推荐
- 51nod1237 最大公约数之和 V3
题意:求 解: 最后一步转化是因为phi * I = Id,故Id * miu = phi 第二步是反演,中间省略了几步... 然后就这样A了......最终式子是个整除分块,后面用杜教筛求一下phi ...
- zoj 3195(LCA加强版)
传送门:Problem 3195 https://www.cnblogs.com/violet-acmer/p/9686774.html 题意: 给一个无根树,有q个询问,每个询问3个点(a,b,c) ...
- 使用K-S检验一个数列是否服从正态分布、两个数列是否服从相同的分布
假设检验的基本思想: 若对总体的某个假设是真实的,那么不利于或者不能支持这一假设的事件A在一次试验中是几乎不可能发生的.如果事件A真的发生了,则有理由怀疑这一假设的真实性,从而拒绝该假设. 实质分析: ...
- 数据正规化 (data normalization) 的原理及实现 (Python sklearn)
原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...
- Kafka工作原理解析以及主要配置详解
Kafka工作原理解析以及主要配置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 无论是是Kafka集群,还是producer和consumer都依赖于Zookeeper集群保 ...
- 一张非常强大的OSI七层模型图解。。。
源自http://www.colasoft.com.cn/download/protocols_map.php,非常适合小白入门,后面罗列出来方便大家浏览记忆...(不经意间看到的,分享一下) OSI ...
- Hadoop记录-Hadoop shell常用命令
- PHP5.5+Nginx1.9
1. 安装Nginx:http://www.cnblogs.com/vurtne-lu/p/7010065.html 2. 编译安装 [root@zabbix opt]# wget http://cn ...
- Java中 break continue return 的区别
1.break break :跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环: ; i < ; i++) { ) { break; // 在执行 ...
- ubuntu配置lua环境,并进行c与lua的相互调用
1.安装lua环境 先查看一下apt可获取的lua版本 我们选择lua5.1版本进行安装 sudo apt install lua5.1 安装完之后测试一下是否安装成功,如果可以正常使用,则lua环境 ...