最短路問題 1

2022-07-11 21:36:15 字數 1655 閱讀 3347

本蒟蒻記性不太好怕忘(一樣的說辭ヽ(ー_ー)ノ),咳,寫這篇最短路的文章來紮實自己的基礎(同時讓自己搞的更明白點)。

在做圖論題的時候,我們往往會通過最短路來進行一些操作,在這篇和下篇文章裡我將會介紹\(dijkstra\)和\(spfa\)兩種常見的方法來解決最短路問題。

\(dijkstra\)可以說是最經典的最短路演算法之一了,也是我們在進行演算法比賽時在無負邊權圖時首選的演算法(\(spfa\)已廢,\(dijstra\)當立(劃去))。這種演算法是由荷蘭計算機大神\(edsger wybe dijkstra\)創造的方法,也以他的名字命名。

接下來我們來看乙個具體的例子來更好的理解\(dijkstra\)演算法。我們來看這樣的乙個場景。

在這張圖中,我們需要求出從點\(1\)到點\(6\)的最短路徑,在這裡我們用之前提到的鏈式前向星來存圖,不了解的可以看看鏈式前向星。

這裡我們首先找到起點\(1\)並將\(1\)點的距離設為\(0\),並標記上已訪問。然後找出它可以直接到達的頂點\(2\)和\(3\),並更新他們的距離。

這時我們看到到\(3\)的距離最小是\(3\)那麼我們便將\(3\)這個點標記上。

這時我們再從點\(3\)出發,發現他可以到達\(2、4、5\)三個點,更新他們。

我們看到從點\(3\)到點\(2\)比從點\(1\)到點\(2\)的距離還要短,所以我們決定從\(1\)到\(3\)到\(2\),標記上點\(2\)。

這時我們再從\(2\)點出發,與點\(2\)相連線的為4點,我們發現從\(2\)到\(4\)比原來的距離要遠,所以更新並標記點\(4\)。

然後再更新與點\(4\)連線的點\(5\)和點\(6\)。

我們可以發現點\(5\)無法再更新了,記錄下點\(5\)。

然後到達點\(6\),並標記。

這時我們發現所有的點已經都被標記了,所以我們就得到的最短路。

#include#include#include#define inf 0x3f3f3f

using namespace std;

const int maxn = 1e5 + 10;

int n, m, cnt = 0;

int head[maxn], dis[maxn], vis[maxn];

struct edgee[maxn];

void add(int u, int v, int w)

void dijkstra()

vis[now] = true;

for(int j = head[now]; j; j = e[j].next)

}} int main()

int s = 1, t = n; //s為起點,w為終點

dijkstra();

printf("%d\n", dis[t]);

return 0;

}

我們來模擬一遍這個圖。

蕪湖~可以看出我們得出了正確的結果。那麼這就是\(dijkstra\)演算法的模板了,在做題過程中我們需要靈活的運用才能夠取得理想的成績。

完結撒花ヾ(✿゚▽゚)ノ

最短路問題(1)

從圖中指定的一點出發走到某一目標點如果存在多種不同的走法,最短的是哪條路?其長度是多少?圖論中解決上述問題的方法都屬於最短路演算法。由於圖的特點不同 儲存結構不同 確立演算法的側重方向不同,所以演算法是多種多樣的。一 無權圖及樹網 在無權圖中,路徑長度只與路徑上的點數有關,而與路徑上的邊權和點權無關...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路總結1 最短路問題概述與樸素dijkstra

最短路系列鏈結 最短路總結1 最短路問題概述與樸素dijkstra 最短路總結2 堆優化dijkstra 最短路總結3 bellmanford 最短路總結4 spfa及應用 最短路總結5 floyd 1.最短路問題概述 若網路中的每條邊都有乙個數值 長度 成本 時間等 則找出兩節點 通常是源節點和阱...