本篇將彙總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行,...