演算法具體原理就不講了,無非是當要返回到前乙個結點時將該結點重新設定為未訪問。
void
dfs(
int start,
int end)
path.
pop_back()
;//刪除最後乙個節點
vis[start]
=false
;//終點重新設定為未訪問
return;}
vis[start]
=true
;//將當前結點設定為已訪問
path.
push_back
(start)
;//加入路徑
for(
int j =
0; j < adj[start]
.size()
; j++)if
(j == adj[start]
.size()
-1)}
}
這裡給出乙個之前實習的問題:
這次疫情湖北受災嚴重,那麼為什麼湖北這麼重要,試證明湖北到全國其他省(不包括兩個寶島)中間都不超過2個省。給定圖鄰接關係city
用dfs求解湖北到其他所有省份的中間不超過2個省的路徑並全部輸出(例如:湖北-江西-浙江;湖北-陝西-內蒙古-黑龍江)
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxv =34;
//最大結點數
int n;
//結點數
bool vis[maxv]=;
//dfs中判斷結點是否被訪問
vector<
int> adj[maxv]
;//dfs的鄰接表
vector<
int> path;
//dfs的路徑
mapint//完成城市名與結點編號的對映
map<
int, string>inverse_maping;
//完成結點編號與城市名的對映
string city[maxv][10
]=,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,,}
;void
creat_graph()
//將中文關係轉換為整型鄰接表,並完成城市名與結點編號的對映;
//printf("%s %d\n", it->first.c_str(), it->second);
for(
int i =
0; i <
34; i++
)for
(int j =
1; j <
sizeof
(city[i]
); j++)}
void
dfs(
int start,
int end)
path.
pop_back()
; vis[start]
=false
;return;}
vis[start]
=true
;
path.
push_back
(start)
;for
(int j =
0; j < adj[start]
.size()
; j++)if
(j == adj[start]
.size()
-1)}
}int
main()
部分結果:
湖北->河南->安徽
湖北->河南->江蘇->安徽
湖北->陝西->河南->安徽
湖北->湖南->江西->安徽……
…湖北->湖南->貴州->重慶
湖北->江西->湖南->重慶
兩點間最短路徑及所有路徑
private setnodes private map links private mapweights nodes用於儲存所有節點,不重複 links為鄰接表 weights為邊上的權值。1 兩點間最短路徑 dijkstra演算法 實現 為 public path shortestpath in...
Dijstra求任意兩點間最短路徑並輸出
用迪傑斯特拉演算法求一點到其餘所有結點的最短路徑。先輸入乙個小於100的正整數n,然後輸入圖的鄰接矩陣 10000表示無窮大,即兩點之間沒有邊 最後輸入兩個0到n 1的整數表示兩個點。先用迪傑斯特拉演算法求給定的第乙個點到其餘所有結點的最短路徑。然後再輸出給定的兩個點之間的最短路徑 按順序輸出最短路...
求兩點間的距離
煙台大學計算機學院 檔名稱 asdasd.cpp 作 者 劉磊 完成日期 2016年5月20日 版 本 號 vc 6.0 問題描述 分別利用成員函式,友元函式和一般函式求兩點的的距離,並設計main 函式完成測試 程式輸入 無 程式輸出 兩點間的距離 include include using na...