dp算法之有代價的最短路徑


題目:有代價的最短路徑

題目介紹:如下圖所示,現在平面上有N個點,此時N=7,每個點可能和其他點相連,相連的線有一定權值,求出從0點到N-1點的消耗權值的最小值。

分析:用動態規划的思路來解決,每一點與其他點的消耗權值的最小值都儲存在一個二維數組中,下一個點消耗的最小值可以根據前一個點來得出。如果兩個點不相連,可以認為這兩點的權值為無窮大。設一個二維數組初始化為無窮,再導入權值初始值,再用狀態方程得出最小值儲存在數組中。

狀態方程:l[k][j] = min(l[k][j], l[k][i] + l[i][j])

我們可以得出0到N-1的最短路徑表格:

距離 0 1 2 3 4 5 6
0 0 2 5 3 1 3 6

代碼:

 1 #include <iostream>
 2 using namespace std;
 3 int min(int a, int b);
 4 int main()
 5 {
 6     int X = 99999;
 7     int N = 7;
 8     int i, j, k;
 9     int **l = new int *[N];
10     for (i = 0; i<N; i++)
11     {
12         l[i] = new int[N];
13     }
14     for (i = 0; i < N; i++)
15     {
16         for (j = 0; j < N; j++)
17         {
18             l[i][j] = X;
19         }
20     }
21     l[0][1] = l[1][0] = 2;
22     l[1][2] = l[2][1] = 3;
23     l[2][6] = l[6][2] = 4;
24     l[0][3] = l[3][0] = 3;
25     l[3][6] = l[6][3] = 3;
26     l[0][4] = l[4][0] = 1;
27     l[4][5] = l[5][4] = 2;
28     l[5][6] = l[6][5] = 3;
29     for (k = 0; k < N; k++)
30     {
31         for (j = 0; j < N; j++)
32         {
33             for (i = 0; i < N; i++)
34             {
35                 l[k][j] = min(l[k][j], l[k][i] + l[i][j]);
36             }
37         }
38     }
39     for (i = 1; i < N; i++)
40     {
41         cout << l[0][i] << endl;
42     }
43 }
44 int min(int a, int b)
45 {
46     if (a > b)
47     {
48         return b;
49     }
50     else { return a; }
51 }

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM