菜鳥的ACM學習之路 Dijkstra演算法

2021-08-26 08:37:08 字數 1062 閱讀 3999

dijkstra演算法的主要目的:

為了解決最小路徑問題。

dijkstra演算法採用一種貪心的策略。宣告乙個陣列dis來儲存源點到各個頂點的最短距離和乙個儲存已經找到了最短路徑的頂點的集合。

初始時,原點 s 的路徑權重被賦為 0 (dis[s] = 0),所有的dis[i]都賦值為無窮。若對於頂點 s 存在能直接到達的邊(s,m),則把dis[m]設為w(s, m)

例如這幅圖,按照dijkstra的演算法,起始點為v1,先將dis[1]=0,dis[2]=無窮,dis[3]=無窮,dis[4]=無窮,dis[5]=無窮,dis[6]=無窮。然後從v1出發,有v3,v6,更新dis[3]=10,dis[6]=100,dis[5]=30,然後,將v1的flag值置成1,代表已經使用過,然後尋找最小的dis[i],發現是dis[3],從3出發,可以更新dis[4]=min(無窮,dis[3]+dist[3][4])=60,同理可以更新剩餘的點,直到每乙個點都已經選取過為止。

dijkstra演算法的**實現:

#include #include #define max 1005

using namespace std;

int n, m, s, t;

int map[max][max];

int dis[max];

int vis[max];

int min(int x, int y)

void dijkstra()

} if (min == 0x7f7f7f7f)

break;

for (int j = 1; j <= n; j++)

dis[j] = min(dis[j], map[pos][j] + dis[pos]);

vis[pos] = 1; }}

int main()

dijkstra();

cout << dis[t] << endl;

return 0;

}

菜鳥的ACM學習之路 馬拉車演算法

好不容易看懂的馬拉車!懶得打原理,就上一道題的 吧。吉哥又想出了乙個新的完美隊形遊戲!假設有n個人按順序站在他的面前,他們的身高分別是h 1 h 2 h n 吉哥希望從中挑出一些人,讓這些人形成乙個新的隊形,新的隊形若滿足以下三點要求,則就是新的完美隊形 1 挑出的人保持原隊形的相對順序不變,且必須...

ACM的學習之路

從小對會寫 的軟體工程師抱有一種敬畏和敬佩的態度,覺得 這麼有技術含量的東西,能夠操作地這麼行雲流水,能夠這麼隨意地玩弄於鼓掌之間,著實讓人望而遠嘆 但同時,我卻不能向那些大神一樣,做到這麼熟練,不論邏輯多複雜的題目,他們似乎都能用一種套路去解決 不能向那些大神一樣,做到舉一反三,學到一種演算法後,...

webpack 菜鳥的學習之路

webpack 是如何實現 hmr 的?實現的原理如何?本場 chat 會以完整的例項來展示hmr 的實現原理,包括 less scss css 檔案的熱載入。webpack 的 watch 模式與一次性打包如何實現?他們的主要區別是什麼?webpack 與 prepack 的關係?如何在 webp...