迪傑斯特拉算法是一種經典的圖論算法,用於求非負帶權圖的最短路徑,我通過使用c++ stl庫中的優先隊列
priority_queue進行實現。
#include<iostream> #include<map> #include<vector> #include<string.h> #include<queue> #include<unordered_set> #include<utility> #include<map> #include<unordered_map> /*int 代表距離,string代表頂點*/ const int maxv=1000000007; using namespace std; void show(unordered_map<string,unordered_map<string,int>>&g) { for(auto&item:g) { cout<<item.first<<endl; for(auto&temp:item.second) { cout<<temp.first<<" "<<temp.second<<endl; } } } void init(unordered_map<string,unordered_map<string,int>>g,unordered_map<string,int>&distance,string& s) { for(auto&item:g) { if(item.first!=s) distance[item.first] = maxv; else distance[item.first] = 0; } } void dijkstra(unordered_map<string,unordered_map<string,int>>&graph,string s,unordered_map<string,int>&distance,unordered_map<string,string>&parent) { //初始化距離數組 init(graph,distance,s); priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>>que; unordered_set<string> seen;//置訪問標記 que.push(pair<int,string>(0,s));// parent[s]="None"; while(!que.empty()) { pair<int,string> item = que.top(); que.pop(); int dist = item.first; string vertex = item.second; seen.insert(vertex);//從優先隊列彈出后則到達這個點的路徑已經確定 for(auto&tmp:graph[vertex]) { //如果這個頂點還沒有添加的話 if(seen.find(tmp.first)==seen.end()) { if(dist + graph[vertex][tmp.first] < distance[tmp.first]) { distance[tmp.first] = dist + graph[vertex][tmp.first]; parent[tmp.first]=vertex; que.push(pair<int,string>(distance[tmp.first],tmp.first)); } } } } } int main() { string node1,node2; int w;
//圖的數據結構 unordered_map<string,unordered_map<string,int>>graph; unordered_map<string,int>distance; unordered_map<string,string>parent; while(cin>>node1>>node2>>w) { graph[node1][node2]=w; } string s="A"; dijkstra(graph,s,distance,parent); for(auto&temp:distance) { cout<<temp.first<<" "<<temp.second<<endl; } cout<<"parent 數組"<<endl; for(auto&temp:parent) { cout<<temp.first<<" "<<temp.second<<endl; } show(graph); return 0; }