動態規劃實現最短路徑問題

2021-09-08 06:54:30 字數 3132 閱讀 2003

一、設計最短路徑的動態規劃演算法

《演算法導論》中一般將設計動態規劃演算法歸納為下面幾個步驟:

1)分析最優解的結構

2)遞迴定義最優解的值

3)自底向上計算最優解的值

4)從計算的最優解的值上面構建出最優解

二、最短路徑的結構

從最優解的結構開始分析(我們假設沒有權值為負的路徑),對於圖g的所有結點對最短路徑的問題,我們能知道一條最短路徑的子路徑都是最短路徑。假設用鄰接矩陣w=w(ij)來表示輸入帶權圖,考慮從結點i到結點j的一條最短路徑p,如果p最多有m(m為有限值)條邊。若i=j,則p的權值為0而且不包含其他邊。若i ≠ j,可以將i到j的路徑轉換為i -> k、k->j。

三、乙個給定的圖

1)給定乙個有向圖

2)我們可以給出這個有向圖的鄰接矩陣

四、c++實現

1 #include 2 #include3 #include4 #include5 #include

6using

namespace

std;

7const

int max_num = 100;8

9 typedef struct

point point;

1718 vectorpoints;

19 vectorres;

20 vectornum;

2122

void

file_read();

23void

createpoint();

24void

optimalbst();

25void

printroot(point p);

26void printoptimalbst(int i, int j, int r, point p, ofstream &filewrite);

27 template

28 type stringtonum(const

string&str)

3536

void

file_read()

44else

49 str1 = "";50

}51}52

res.push_back(str1);

53fileread.close();54}

55}5657

void

createpoint()

67 p.n =n;

68for(int k = 0; k<=n; k++) p.p[k] = stringtonum(temp_str[k]);

69for(int k = n + 1; k1)] = stringtonum(temp_str[k]);

70points.push_back(p);71}

72}7374

//根據書上的偽**:接收概率列表p1....pn和q0.....qn以及規模n作為輸入 計算出e和root

75void

optimalbst()

85 p.n =n;

8687

for(int k = 0; k<=n; k++) p.p[k] = stringtonum(temp_str[k]);

88for(int k = n + 1; k1)] = stringtonum(temp_str[k]);

8990

//初始化只包括虛擬鍵的子樹

91for (int i = 1;i <= p.n + 1;++i)

95//

由下到上,由左到右逐步計算

96for (int len = 1;len <= p.n;++len)

110}

111}

112}

113points.push_back(p);

114}

115}

116117

void printoptimalbst(int i, int j, int r, point p, ofstream &filewrite)

126127

if (j < i - 1

)else

if (j == i - 1)

136else

142 printoptimalbst(i, root_node - 1

, root_node, p, filewrite);

143 printoptimalbst(root_node + 1

, j, root_node, p, filewrite);

144}

145146

//輸出最優二叉查詢樹所有子樹的根

147void

printroot(point p)

153 cout <

154}

155 cout <

156}

157158

intmain()

168filewrite.clear();

169return0;

170 }

上述**是將給定的鄰接矩陣從檔案中讀取

然後根據輸入的鄰接矩陣求出最短路徑

風沙迷了眼 閱讀(

...)

編輯收藏

動態規劃最短路徑問題

最短路徑問題 下圖給出了一張地圖,地圖中每個頂點代表乙個城市,兩個城市間的連線代表道路,連線上的數值代表道路長度,求從a地到e地的最短路徑。分析 本題可以利用深度搜尋法求解,偽 如下 vars 未訪問的城市集合 dist i,j 儲存任意兩個城市間的距離陣列 function search city...

c 實現 動態規劃之最短路徑和問題

題目描述 給定乙個由非負整數填充的m x n的二維陣列,現在要從二維陣列的左上角走到右下角,請找出路徑上的所有數字之和最小的路徑。注意 你每次只能向下或向右移動。輸入 1,2 5,6 1,1 輸出 8方法 二維dp,初始化第一行和第一列,在此基礎上去求解 class solution for int...

動態規劃 最短路徑跳箱子問題

求從第乙個箱子跳到最後乙個箱子最短需要多少步 輸入乙個陣列 如 1,3,0,1,5 表示第乙個箱子能最多往右跳1步 第二個最多往右跳3步 若不能跳到最後乙個箱子輸出 1 若開始就在最後乙個箱子輸出0 假設輸入的陣列 為長度為n的 nums n 如 1,3,0,1,5 首先設定乙個陣列every pa...