最短路----Dijkstra

Now-2019.8.10

Dijkstra可以解決從起始點(diǎn)到終點(diǎn)的最短路徑問題匾浪;

常用的算法有 Dijkstra 跺涤, Floyd 匈睁, SPFA ;

該文章主要講的是 Dijkstra 算法;

Dijkstra算法是貪心思想的體現(xiàn)桶错,即不斷尋找最短的路徑航唆,并不斷更新(也稱 松弛)最終找到要找的出口。

所謂的松弛操作即是將已知到達(dá)的路徑 與 走過之后更新的路徑 相比院刁,如果有縮短糯钙,即可將新的路徑存儲到表中;

其中較為重要的 :dis[maxn];//記錄目前的路徑長短

? ? ? ? ? ? ? ? ? bool? ? ?vis[maxn];//visit退腥?

有兩個數(shù)組任岸,dis和vis含義參見上面,初始時vis中只有起點(diǎn)狡刘,更新dis中的起點(diǎn)到所有點(diǎn)的距離.

遍歷所有節(jié)點(diǎn)享潜,找到距離起點(diǎn)最近的一個點(diǎn)K,將這個點(diǎn)加入vis中標(biāo)記

進(jìn)行松弛操作嗅蔬,遍歷沒有在vis數(shù)組中的其他所有點(diǎn)剑按,比較起點(diǎn)——>該點(diǎn)和起點(diǎn)——>K點(diǎn)——>該點(diǎn)的距離,

重復(fù)2-3操作澜术,直到所有的點(diǎn)遍歷完

#define INF 65535

int n,m,s,t;

int Chara[N][N],dis[N],vis[N],p[i];//chara為鄰接矩陣艺蝴;

void Dijkstra(int src)? //src傳入的起點(diǎn)

{

? ? for(int i=0; i<m; i++) //初始化起點(diǎn)到所有點(diǎn)的距離

? ? {

? ? ? ? dis[i] = Chara[src][i];

? ? ? ? vis[i] = 0;//設(shè)為false

? ? ? ? p[i]=0;

? ? }

? ? dis[src] = 0; //到自身距離為0

? ? vis[src] = 1; //標(biāo)記 注src=0

? ? for(int i=0; i<m; i++)

? ? {

? ? ? ? int ans = INF,k;

? ? ? ? for(int j=0; j<m; j++) // 尋找未被訪問過距離起點(diǎn)v0最近的

? ? ? ? {

? ? ? ? ? ? if(!vis[j] && dis[j] < ans)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? k = j;

? ? ? ? ? ? ? ? ans = dis[j];

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? vis[k] = 1;? //標(biāo)記已訪問

? ? ? ? if(ans == INF) break; //表示剩下所有點(diǎn)都不通

? ? ? ? for(int j =0; j<m; j++)? //松弛操作,更新起點(diǎn)到所有未訪問點(diǎn)的距離

? ? ? ? {

? ? ? ? ? ? if(!vis[j] &&? dis[k] + Chara[k][j]<dis[j] )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? dis[j] = dis[k] + Chara[k][j];

? ? ? ? ? ? ? ? p[j]=k;//存放前驅(qū)節(jié)點(diǎn)

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

這是網(wǎng)上較為基礎(chǔ)的原始代碼鸟废,轉(zhuǎn)載:https://blog.csdn.net/qq_36932169/article/details/78806863

但是在真正寫題的時候猜敢,題目并不會讓寧把模板套上去就能用:例如 如果上面代碼中的N很大,毫無疑問將會失敽醒印缩擂;

這就需要將Dijkstra代碼進(jìn)行優(yōu)化。下面是 用優(yōu)先隊列 和 鄰接表 進(jìn)行? 的優(yōu)化兰英;

struct edge {

int from , to , w;//w is the cost;

edge(int a,int b,int c)from(a)...;

}撇叁;

vector<edge> e[NUM];

struct s_node{

? ? ? ? int id, n_dis;

? ? ? ? s_node(int a, int b) ...;

? ? ? ? bool operator < (const s_node &a) const{

? ? ? ? return n_dis>a.n_dis;

}

}

int pre[NUM];//

void Dijkstra()

{

?int s,dis[NUM];

bool visit[NUM];

for(1 to n)? dis[i]=inf;visit[i]=false;//? ? 初始化

dis[s]=0;//初始點(diǎn)到自身距離為0;

priority_queue<s_node>? Q;//優(yōu)先隊列

Q.push(s_node(s,dis[s]));//加入初始node? ?id= s畦贸,n_dis=0;

while(!Q.empty())

{

? ? ? ? ? ? s_node u= Q.top();

? ? ? ? ? ? Q.POP();

? ? ? ? ? ? if(!visit[u.id])//訪問過陨闹?

? ? ? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? visit[u.id]=true;

? ? ? ? ? ? for(i=0;i<e[u.id].size();i++)

???????????{

? ? ? ? ? ? ? ? edge y = e[u.id][i];//查找與該點(diǎn)相鄰的點(diǎn)

? ? ? ? ? ? ? ? if(!visit[y.to])

? ? ? ? ? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? ? ? if(dis[y.to]>y.w+ u.n_dis) // 松弛

? ? ? ? ? ? ? ? ? ? ? ? dis[y.to]=y.w+ u.n_dis ;

? ? ? ? ? ? ? ? ? ? ? ? Q.push(s_node(y.to,dis[y.to]));

? ? ? ? ? ? ? ? ? ? ? ? pre[y.to]=u.id;

????????????}

}

}

該代碼出自《算法競賽 入門到進(jìn)階》一書 P252 ;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薄坏,一起剝皮案震驚了整個濱河市趋厉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胶坠,老刑警劉巖君账,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沈善,居然都是意外死亡乡数,警方通過查閱死者的電腦和手機(jī)椭蹄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來净赴,“玉大人绳矩,你說我怎么就攤上這事【脸幔” “怎么了翼馆?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長金度。 經(jīng)常有香客問我应媚,道長,這世上最難降的妖魔是什么猜极? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任中姜,我火速辦了婚禮,結(jié)果婚禮上魔吐,老公的妹妹穿的比我還像新娘扎筒。我一直安慰自己,他們只是感情好酬姆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布嗜桌。 她就那樣靜靜地躺著,像睡著了一般辞色。 火紅的嫁衣襯著肌膚如雪骨宠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天相满,我揣著相機(jī)與錄音层亿,去河邊找鬼。 笑死立美,一個胖子當(dāng)著我的面吹牛匿又,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播建蹄,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼碌更,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞慎?” 一聲冷哼從身側(cè)響起痛单,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劲腿,沒想到半個月后旭绒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年挥吵,在試婚紗的時候發(fā)現(xiàn)自己被綠了重父。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔫劣,死狀恐怖坪郭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脉幢,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布嗦锐,位于F島的核電站嫌松,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奕污。R本人自食惡果不足惜萎羔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碳默。 院中可真熱鬧贾陷,春花似錦、人聲如沸嘱根。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽该抒。三九已至慌洪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凑保,已是汗流浹背冈爹。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欧引,地道東北人频伤。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像芝此,于是被迫代替她去往敵國和親憋肖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容