迪傑斯特拉+優先隊列實現


迪傑斯特拉算法是一種經典的圖論算法,用於求非負帶權圖的最短路徑,我通過使用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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM