深度優先算法實現圖的遍歷 解求出最短路徑 (圖論算法)

前言: 其實數學中的很多東西都是很抽象的,我們可以不妨將抽象的問題轉化爲數學問題,比如說三維我們可以轉換爲二維,二維我們可以繼續轉換爲一維,那麼最終我們以畫表已數據可視化的方式展現出來就又成了一個簡單的數學問題,其中難就難在該以什麼樣子的方式去轉換,而這個轉化的過程呢也就是所謂的 ——— 算法

題目已知有5個城市和8條公路,圖中已經標出每個城市到每個城市之間的距離,求出1號城市到5號城市的最短路徑。

思路:想一想圖中的問題我們是不是可以把它轉換成表格的形式看起來更加舒服,更容易得出結果呢?那既然是表格我們是不是在程序可以把這些數據放到一個二維數組中,再通過深度優先算法,對其進行遍歷,不就實現了最短路徑的求解麼。
轉換成二維表格如下:(此圖爲個人畫的草圖,湊合看吧~~)
在這裏插入圖片描述
根據轉換的矩陣,那麼此題我們可以建立一個 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章