最短路徑與搜尋之列印路徑

2021-08-15 02:25:10 字數 2958 閱讀 9688

本篇將彙總floyd, spfa, bfs , dfs 以及01揹包

的路徑列印思想及**實現, 是較為冷門的acm題目考點, 但其中的思想要求每個程式設計師掌握(咳咳...雖然我也剛剛學會...)

floyd演算法是最基礎的最短路徑演算法,因此優先講解:(此篇將預設各位讀者已了解相應演算法原理, 故只解釋列印路徑的**)

#include

#include

using namespace std;

inta[100][100];

intpath

[100][100];

int main(void) }

for(

intk = 1; k <= n; k++)   }

} }stack

<

int>s;

intsta = 1, ed = n;

//假設要求輸出點1 到 點n 的路徑, 則從n點開始向前尋找間隔點

直到無間隔點為止, 這時將起點和與起點相鄰的點放入棧中

while

(path

[sta][ed] != 0)

s.push(ed);

s.push(sta);

while

(!s.empty())

cout << endl;

} }

spfa是

單源最短路徑

的快速演算法, 是迪傑斯特拉演算法的優化(個人認為), 平時較為常見:

#include

#include

void spfa(int sta);

using namespace std;

inta[1000][1000];

intdist

[1000];                            

//記錄起點到i點的距離

intpath

[1000];

//記錄路徑, 儲存間隔點, path[i]即為起點與i點的間隔點,無間隔點,則為0

bool

vist

[1000]; 

//標記點是否使用過

intn, m;

int main(void)

} spfa(1);

stack<

int> s;

while

(path[n] != 0)

s.push(1);

while

(!s.empty() ) }

void spfa(

intsta)

} }}}

bfs演算法用於解決最優解問題, 此處只是列印

最短的路徑:

#include

#include

#include

using namespace

std;

intn, m;

struct

node sta;

char

a[100][100];

intvist

[100][100];

void

bfs(node sta);

intpath

[100][100];

int main(void) }} 

bfs(sta);

}void

bfs(node sta)

sa.push(sta);

//起點入棧

while

(!sa.empty())

return; 

}int

xx = ;

intyy = ;

for(

inti = 0; i < 4; i++) }}

} dfs搜尋可列印

全部連通的路徑

, **實現如下:

#include

#include

#include

using namespace

std;

char

a[100][100];

intvist

[100][100];

struct

node sta;

stacksa, sb;

intcnt = 0;

void

dfs(node sta);

intn, m;

int main(void) }}

sa.push(sta);

//起點入棧並標記

vist

[sta.x][sta.y] = 1;

dfs(sta);}}

void

dfs(node sta)

while

(!sb.empty())

}int

xx = ;

intyy = ;

node vb;

for(

inti = 0; i < 4; i++)

}return;

} 01揹包問題列印路徑必須建立在

n * n 的空間複雜度

上, 優化演算法無法記錄路徑:

#include

#include

#include

#include

using namespace std;

int n, m;

struct node a[1005]; 

int

dp[500][1005];

bool

path[500][1005];

int main(void)

for(int i = 1; i <= n; i++) }}

}for(int i = n; i >= 1 && m > 0; i--) }} 

}總結:路徑列印除對dfs 是遞迴回溯過程外,floyd,spfa, bfs, 01揹包問題等均為同一方法,只是實現不盡相同, 掌握一種即可快速上手.

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...