最短路徑問題——dijkstra演算法

來源:互聯網
上載者:User

標籤:

僅談談個人對dijkstra的理解,dijkstra演算法是基於鄰接表實現的,用於處理單源最短路徑問題(順便再提一下,處理單源最短路徑問題的還有bellman演算法)。開闢一個結構體,其變數為邊的終點和邊權,這時候還需要一個這個結構體類型的數組,數組的下標則為邊的始點,我們都知道在圖中,一個始點連出去的可能不止一條邊,這樣的話就類似用到一個二維數組了,我們在arr[][]的第一維存放的是邊的始點,第二維則是這個始點對應的不同終點及其權值,學過鄰接表的人應該就能看出來這就是一個鄰接表了唄!

而對於鄰接表的實現這裡我選擇的是用使一個vector容器,vector的一大好處在於對於數組的空間大小分配它可以自動合理處理(此處僅為個人理解,想要清楚具體瞭解vector請見書或者百度),說到這兒我的各條邊算是在鄰接表中存好了,那具體要如何?最短路徑,我還需要一個堆,一個小頂堆,對於源點s,它的dis[s]=0(dis[]數組儲存的是源點到該點的最短距離)這個時候我們將dis[s]和它對應的終點(這個時候依舊是s)存入堆當中,然後從堆中提出dis【】最小的點,利用鄰接表找到它的每一個相鄰的點,也就是以它為起點的每一個終點,如果終點的dis已經小於起點了,那就繼續,否則判斷,如果終點的dis大於起點的dis加上這條邊對應的邊權的和,那麼改變終點的dis,並把其存入堆中。。。可能有點混亂,那就看代碼吧:

#include<iostream>
#include<vector>
#include<queue>
#define INF 10000000
using namespace std;

struct eg
{
int t;
int c;
eg(int t1,int c1) //一個建構函式
{
t=t1;
c=c1;
}
};
typedef pair<int,int>p;
vector<eg>G[100];
int dis[100];//用於儲存源點到該點的最短距離
priority_queue< p,vector<p>,greater<p> > que;//加上vector<p>,greater<p>後實現的則是一個小頂堆,不然實現的是一個大頂堆

void dijkstra(int s)
{
fill(dis,dis+100,INF);//先對每一個點的dis賦初值為一個極大數
dis[s]=0;//源點到源點

que.push(p(0,s));

while(!que.empty())
{
p p1=que.top();
que.pop();
if(dis[p1.second]<p1.first) continue;
int size=G[p1.second].size();
for(int j=0;j<size;j++)
{
eg e=G[p1.second][j];
if(dis[e.t]>p1.first+e.c)
{
dis[e.t]=p1.first+e.c;
que.push(p(p1.first+e.c,e.t));//需要注意的是存入堆中的到底是什麼
}
}
}
}


void solve()
{
int V,E;
cin >> V >> E;
for(int i=0;i<E;i++)
{
int s1,t1,c1;
cin >>s1 >> t1 >> c1;
G[s1].push_back(eg(t1,c1));//按源點s1儲存
}
int s;
cin >> s;
dijkstra(s);
int t;
cin>> t;
cout << dis[t] << endl;
}

int main()
{
solve();
return 0;
}

最短路徑問題——dijkstra演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.