DFS(深度优先搜索)

妖精的绣舞 提交于 2019-11-29 12:06:46

求有向图中的最短路径(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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!