dijkstra演算法又稱為單源最短路徑,所謂單源是在乙個有向圖中,從乙個頂點出發,求該頂點至所有可到達頂點的最短路徑問題。
設g=(v,e)是乙個有向圖,v表示頂點,e表示邊。它的每一條邊(i,j)屬於e,都有乙個非負權w(i,j),在g中指定乙個結點v0,要求把從v0到g的每乙個接vj(vj屬於v)的最短有向路徑找出來(或者指出不存在)。
dijstra演算法是運用貪心的策略,從源點開始,不斷地通過相聯通的點找出到其他點的最短距離
基本思想是:
設定乙個頂點的集合s,並不斷地擴充這個集合,乙個頂點屬於集合s當且僅當從源點到該點的路徑已求出。開始時s中僅有源點,並且調整非s中點的最短路徑長度,找當前最短路徑點,將其加入到集合s,直到終點在s中。
基本步驟:
1、把所有結點分成兩組:
第一組:包括已經確定最短路徑的結點;
第二組:包括尚未確定最短路徑的結點。
2、開始時,第一組只包含起點,第二組包含剩餘的點;
3、用貪心的策略,按最短路徑長度遞增的順序把第二組的結點加到第一組去,直到v0可達的所有結點都包含於第一組中。在這個過程中,不斷更新最短路徑,總保持從v0到第一組各結點的最短路徑長度dist都不大於從v0到第二組任何結點的路徑長度。
4、每個結點對應乙個距離值,第一組結點對應的距離就是v0到此結點的最短路徑長度,第二組結點對應的距離值就是v0由第一組結點到此結點的最短路徑長度。
5、直到所有的頂點都掃瞄完畢(v0可達的所有結點都包含於第一組中),找到v0到其它各點的所有最短路徑。
#include
#include
#include
using namespace std;
const int inf=999999;
const int n=100;
int dis[n],c[n][n],prev[n];
int n,m;
void dijkstra(int sta)
dis[sta]=0;
for(int i=2; i<=n; i++)}}
}}void search(int sta,int end)
que[tot]=sta;
for(int i=tot;i>0;i--)
i==1?cout<";
}int main()
{cin>>n>>m;
int p,q,len;
int i,j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
c[i][j]=inf;
while(m--)
{cin>>p>>q>>len;
if(len/* shuru57
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
*/
中國外賣有多火?歪果仁 簡直救了我的命
程式設計驛站 www.cppcns.com 8月23日 訊息今天中午吃啥glfhl?點外賣 對於我們懶人來說,外賣大概是這個世上最偉大的發明之一了 你知道歪果仁愛上中國的n個理由,其中有一項就是 外賣 看來中國的美食正逐漸俘獲外國人的心。某節目街頭採訪了幾位歪果仁對中國外賣的看法,他們的回答也是讓人...
故宮為什麼是歪的
從地圖看,故宮是歪的,不是正南正北,而是南偏東一點 我們都知道,北京為都城,而故宮處在北京中軸線上,北京故宮的建築不應該是正南正北的。那麼為什麼歪了呢?風水上認為正南正北正東正西位有著巨大的煞氣和衝,正位置正好坐落在正南正北,會每天被煞氣衝撞。常人要躲開這幾個正方向。一些墓地 墓穴的位置也不能是正南...
最短的名字
在乙個奇怪的村子中,很多人的名字都很長,比如aaaaa,bbb and abababab。名字這麼長,叫全名顯然起來很不方便。所以村民之間一般只叫名字的字首。比如叫 aaaaa 的時候可以只叫 aaa 因為沒有第二個人名字的前三個字母是 aaa 不過你不能叫 a 因為有兩個人的名字都以 a 開頭。村...