求有向图中的最短路径(JAVA+DFS算法实现)
问题描述
给定一个有向图,如下图所示,求从1号顶点到5号顶点的最短路径。
输入数据格式为第一行输入顶点数和边数,从第二行开始每一行输入3个整数,分别代表连接顶点的边和权重。
例如:1 2 2,表示从1号顶点到2号顶点连接的边,权重为2。
Input:
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
Output:
9
算法实现
package test2; import java.util.Scanner; public class dfstest { static int[][] edges=new int[100][100]; static int[] vertes=new int[100]; static int n,m,min=Integer.MAX_VALUE; static Scanner scanner=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub n=scanner.nextInt(); m=scanner.nextInt(); for (int i = 1; i <= n; i++) {//n个顶点 for (int j = 1; j <=m; j++) {//m条边 if (i==j) { edges[i][j]=0; }else { edges[i][j]=Integer.MAX_VALUE; } } } for (int j = 1; j <=m; j++){//因为有m条边 int a=scanner.nextInt(); int b=scanner.nextInt(); int c=scanner.nextInt(); edges[a][b]=c; } vertes[1]=1; dfs(1,0); System.out.println(min); } public static void dfs(int cur,int dis) {//cur为当前顶点,dis为经过路径长度 if (dis>min) { return; } /** * 判断是否达到最后一个结点,更新最小值,返回 * */ if (cur==n) { if (dis<min) { min=dis; return; } } /** * 当前点到其他各点之间可连通但是还未添加进来时,遍历执行 * */ for (int i = 1; i <=n; i++) { if (edges[cur][i]!=Integer.MAX_VALUE&&vertes[i]==0) { vertes[i]=1; dfs(i,dis+edges[cur][i]); //回溯 vertes[i]=0; } } return; } }
――――――――――――――――
版权声明:本文为CSDN博主「梅森上校」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/seagal890/article/details/96048023
来源:51CTO
作者:rootkiss
链接:https://blog.csdn.net/rootkiss/article/details/100807155