已知有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