第九章 動態規劃-1261:【例9.5】城市交通路網

1261:【例9.5】城市交通路網

時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由A->E。試用動態規劃的最優化原理求出A->E的最省費用。
在這裏插入圖片描述
如圖:求v1到v10的最短路徑長度及最短路徑。

【輸入】
第一行爲城市的數量N;
後面是N*N的表示兩個城市間費用組成的矩陣。

10
0  2  5  1  0  0  0  0  0  0
0  0  0  0 12 14  0  0  0  0
0  0  0  0  6 10  4  0  0  0
0  0  0  0 13 12 11  0  0  0
0  0  0  0  0  0  0  3  9  0
0  0  0  0  0  0  0  6  5  0
0  0  0  0  0  0  0  0 10  0
0  0  0  0  0  0  0  0  0  5
0  0  0  0  0  0  0  0  0  2
0  0  0  0  0  0  0  0  0  0

【輸出】
A->E的最省費用。

minlong=19
1 3 5 8 10


思路:設dp[i][1]=N,表示第i個城市到第1個城市距離邊界爲N然後從第i個城市開始,對於每個城市每次都遍歷所有的點,然後更新距離設dp[i][1]表示第i個城市到第1個城市距離最短時經過的下一個城市然後輸出就好了。dp[n][1] 存最短路徑.

#include<cstdio>
#include<iostream>
using namespace std; 
const int N = 1000 + 10;
int a[N][N],n,dp[N][3];
int k[N];
void find(int k) //輸出入過的各個城市 
{
	if(k != 1) 
	find(dp[k][2]);
	cout << k <<' '; 
}

int main(){
	cin >> n;
	for(int i = 1 ; i <= n; i++)
	 for(int j = 1; j <= n;j++)
	 cin >> a[i][j];        //打印表 
	 for(int i = 2;i <= n;i++)
	 dp[i][1] = N;  //DP邊界 
	 k[1] = 1;
	 //計算最短路徑
	 for(int i = 2 ; i <= n ;i++)   //第二個城市開始循環
	  {
	  	for(int j = 1 ; j < n; j++)
	  	{
	  		if(a[j][i] != 0) //表示j到i存在通路 
	  		{
	  			if(dp[i][1] > dp[j][1] + a[j][i])
	  			{
	  				dp[i][1] = a[j][i] + dp[j][1]; //城市i 到終點最短距離 
	  				dp[i][2] = j;
				  }
			  }
		  }
	  }
	  printf("minlong=%d\n",dp[n][1]);
	  find(dp[n][2]);
	  cout << n << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章