第二節 城市地圖-圖的深度優先遍歷
基於鄰接矩陣的儲存有向圖的深度優先遍歷演算法
在處理無向圖初始化的時候有一點需要注意,要保證無向圖的對稱性
即graphic[i][j] = graphic[j][i]
#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; typedef vector<vector<int> > VVI; typedef vector<bool>VB; int res = INT_MAX; void dfs(int cur, int dist, VVI& g, VB& visit){ if(dist > res) return; if(cur == visit.size()-1){ if(dist < res) res = dist; return; } for(int i =0 ; i < visit.size(); ++ i){ if(g[cur][i]!=INT_MAX && !visit[i]){ visit[i] = true; dfs(i,dist+g[cur][i],g,visit); visit[i] = false; } } } int main(){ int n,m; cin >> n >> m; VVI graphic(n,vector<int>(n,INT_MAX)); for(int i = 0 ; i < n ; ++ i) graphic[i][i] = 0; for(int i = 0 ; i < m ; ++ i){ int a,b ,c; cin >> a >> b >> c; graphic[--a][--b] = c; } VB visit(n,false); visit[0] = true; dfs(0,0,graphic,visit); cout<<res<<endl; }
第三節 最少轉機-圖的廣度優先遍歷
基於鄰接矩陣的儲存無向圖的廣度優先遍歷演算法
廣度優先搜尋更加適用於所有邊的權值相同的情況
#include <iostream> #include <vector> #include <algorithm> #include <climits> #include <queue> #include <utility> using namespace std; typedef vector<vector<int> > VVI; typedef pair<int,int> Node; int main(){ int n,m, startPoint,endPoint; cin >> n >> m >>startPoint >> endPoint ; --startPoint; --endPoint; VVI graphic(n,vector<int>(n,INT_MAX)); for(int i = 0 ; i < n ; ++ i) graphic[i][i] = 0; for(int i = 0 ; i < m ; ++ i){ int a,b; cin >> a >> b; --a;--b; graphic[a][b] = 1;graphic[b][a]=1; } vector<bool> visit(n,false); queue<Node> que; que.push(Node(startPoint,0)); visit[startPoint] = true; while(!que.empty()){ Node tmp = que.front();que.pop(); int point = tmp.first; for(int i = 0 ; i < n ; ++ i){ if(!visit[i] && graphic[point][i]!=INT_MAX){ visit[i] = true; que.push(Node(i,tmp.second+1)); if( i == endPoint){ break; } } } } cout<<que.back().second<<endl; }