深度优先算法实现图的遍历 解求出最短路径 (图论算法)

前言: 其实数学中的很多东西都是很抽象的,我们可以不妨将抽象的问题转化为数学问题,比如说三维我们可以转换为二维,二维我们可以继续转换为一维,那么最终我们以画表已数据可视化的方式展现出来就又成了一个简单的数学问题,其中难就难在该以什么样子的方式去转换,而这个转化的过程呢也就是所谓的 ——— 算法

题目已知有5个城市和8条公路,图中已经标出每个城市到每个城市之间的距离,求出1号城市到5号城市的最短路径。
深度优先算法实现图的遍历 解求出最短路径 (图论算法)_第1张图片

思路:想一想图中的问题我们是不是可以把它转换成表格的形式看起来更加舒服,更容易得出结果呢?那既然是表格我们是不是在程序可以把这些数据放到一个二维数组中,再通过深度优先算法,对其进行遍历,不就实现了最短路径的求解么。
转换成二维表格如下:(此图为个人画的草图,凑合看吧~~)
深度优先算法实现图的遍历 解求出最短路径 (图论算法)_第2张图片
根据转换的矩阵,那么此题我们可以建立一个 5 x 5 的二维数组。在定义的时候一定要对数组进行初始化,约定每个城市到每个城市之间的距离为0,无法到达我们就用无限大(99999999)表示。
核心代码:

public class Main {

	static int m,n;   //静态变量m表示城市的个数,n表示总路线的条数
	static int e[][]=new int[101][101];
	static int book[]=new int[101];   //标记数组,主要在后面标记已走过的路线,防止重复
	static int min=999999;    
	public static void main(String[] args) 
	{
		Scanner s=new Scanner(System.in);
		m=s.nextInt();   //表示城市的个数
		n=s.nextInt();   //表示总路线
		int a,b,c;
		//有m个城市,所以建立一个m*m的矩阵
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(i==j)
					e[i][j]=0;  //每个城市到每个城市之间的距离为0
				else
					e[i][j]=min;   //也就是初始化为无限大的数
			}
		}
		for(int i=1;i<=n;i++)
		{
			a=s.nextInt();    
			b=s.nextInt();
			c=s.nextInt();   //城市与城市之间的距离
			e[a][b]=c;     //存储到二维数组中(也就是转换后的矩阵中)  
		}
		dfs(1,0);   //从第一个城市出发,记录步数从0开始     
		System.out.println(min);	
	}
	private static void dfs(int sta, int temp) 
	{
		if(sta==5)     //此处的5也就是到达第五个城市
		{
			if(min>temp)
				min=temp;
			return;
		}
		for(int i=1;i<=5;i++)
		{
			if(e[sta][i]!=min && book[i]==0)
			{
				book[i]=1;   //对走过的路线进行标记
				dfs(i,temp+e[sta][i]);
				book[i]=0;    
			}
		}
		return;
	}
}

运行分析:
1→2→3→4→5 路劲长度为14
1→2→5 路劲长度为9
1→5 路劲长度为10

运行结果: 9

你可能感兴趣的:(算法,程序设计,Java,蓝桥杯,Java实现深度优先算法,蓝桥杯)