最近集訓有三個老師講到過最短路徑問題,所以現在把求最短路徑的幾種方法總結一下。
一、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行,...