【问题描述】

建立一个从源点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);
}
}

最新文章

  1. apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for
  2. js isArray
  3. 二叉树节点个数题目[n0,n1,n2]
  4. TPatch动态补丁系统(iOS)
  5. ajax 城市区域选择三级联动
  6. [iOS]解决模拟器无法输入中文问题
  7. &lt;s:iterator&gt;&lt;/s:iterator&gt;循环指定输出,(status的方法使用)
  8. MySql5.1在Win7下的安装与重装问题的解决
  9. Vim应用
  10. JavaScript 实现Map
  11. 在 go/golang语言中使用 google Protocol Buffer
  12. tooltip 鼠标移动上去出现图片或文字与title大同小异
  13. 837B. Balanced Substring
  14. RedHat Enterprise Linux 6.4使用yum安装出现This system is not registered to Red Hat Subscription Management
  15. AtCoder arc061C Snuke&#39;s Subway Trip
  16. 【第一部分】07Leetcode刷题
  17. centos7 下通过yum安装JDK
  18. poj 2387——单源最短路权值大于0
  19. UI自动化环境准备
  20. java 继承多态的一些理解和不理解

热门文章

  1. A1074. Reversing Linked List
  2. Flash与JavaScript互动
  3. 牛客练习赛29 F 算式子
  4. .NET中26个优化性能方法
  5. 目前最全的IT技术问答、社区、科技服务网站合集
  6. myeclipse 怎么安装与激活
  7. 学习windows编程 day4 之 绘制随机矩形和peekMessage
  8. UESTC - 1168 凤神与狗
  9. 通过read()读文件
  10. c/s 给 服务器上传文件(c/s和b/s互传文件)