最短路徑問題

2021-08-04 18:58:10 字數 1032 閱讀 9645

最近集訓有三個老師講到過最短路徑問題,所以現在把求最短路徑的幾種方法總結一下。

一、floyd-warshall演算法

求兩點間的最短距離,可以用dp來求解任意兩點間的最短距離。從點1到點2的距離,無非兩種情況,第一種是直接從點1到點2,第二種是點1先到其他點,然後再到點二。由此就可以得出狀態轉移方程:dp[i][j] = min ( dp[i][j], dp[i][k] + dp[k][j] ),這個方程應該很好理解,所以下面直接給出**。

int d;//d[u][v]表示權值,d[u][u] = 0 

int v;//頂點數

void floyd_warshall()

可以思考一下,為什麼把節點k放在最外層?

參考部落格:

二、dijkstra演算法

我認為,這個演算法的主要思想就是貪心。令集合s = ,t = ,然後一次把t中的距離s集合最近的點依次加入到s中,用乙個陣列記錄下最近距離。

void dijkstra()

}vis[k] = true;

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

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

dis[j] = dis[k] + map[k][j];

}}

三、bellman-ford演算法

不知道怎麼把這個演算法講清楚,請直接參考:

struct edge

es[20010];

void bellman_ford()

該演算法還可以檢驗圖中有沒有負圈

//若返回true,則存在負圈 

bool find_negative_loop()

} }return false;

}

四、spfa演算法

該演算法就是用佇列來維護,優化bellman_ford演算法

最短路 最短路徑問題

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

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...