最短路總結(1)

2021-10-08 16:09:51 字數 1550 閱讀 1896

最短路徑問題是圖論研究中的乙個經典演算法問題, 旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑

這篇文章就是介紹幾種關於最短路徑的幾種演算法

1.定義

動態規劃以」途徑點集大小」為階段,以一種n

nn的演算法,更新i-j的最短路,列舉,乙個k點,為中轉點,然後判斷是直接的段還是間接的短

2.鄰接矩陣演算法

#include #include #include int n, m, ty;

int x, y;

double e;

double dis[55][55];

int s, t;

int main()

}scanf("%d %d %d", &n, &m, &ty);

for (int i = 1; i <= m; i++)

for (int k = 1; k <= n; k++) }}

}while (ty--)

}

3.鄰接表。。。。貌似沒有太大的優化

4.優缺點

首先,他是最短路中萬能的,但時間大

1.定義

點分成兩組:已經確定最短路、尚未確定最短路不斷從第2組中選擇路徑長度最短的點放入第1組並擴充套件本質是貪心,只能應用於正權圖

假設它的起點是 a ,要求它到各點的最短距離dijkstra 思路是維護乙個集合 s ,集合內的點是已經確定最短路的點,可以視為乙個大整體,每次操作找出與集合相鄰的點中距離起點最近的點加入集合中,並確定它的最短路為它的上家的最短路+該邊權值,存在 dis 中

2.最最最普通演算法

int dijkstra()

} if(!k)

vis[k]=1;

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

}} return dp[t];

}

3.鄰接表

#include using namespace std;

int n,m;

int x,y;

bool vis[100005];

int k;

int e;

int dp[10005];

struct ss;

vectordis[1005];

int s,t;

int dijkstra()

} if(!k)

vis[k]=1;

for(int j=0;jdis[k][j].val+dp[k])

} }return dp[t];

}int main()

s=1;

t=n;

printf("%d",dijkstra());

}

4.鄰接表加優先佇列

int dijkstra()

for(int i=0;idis[temp.s]+g[temp.s][i])

}} return dis[t];

}

4.關於dijkstra的證明

其實就是證明貪心的正確性

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

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

最短路總結

寫個部落格記錄一下最短路的幾種演算法,盡量做最正確的解答,減少大家的疑惑,網上有好多講的都抄來抄去,還有好多講的都是錯誤的。熟悉的最短路演算法就幾種 bellman ford,dijkstra,spfa,floyd,下面針對這幾個演算法具體解析一下。首先說明一點,就是關於負環的問題。bellman ...

最短路總結

穿越空間的限制,走最短的路找到你 u v之間的最短路滿足以下限制 對任意k g v,e 有 dist u,v dis u,k dis k,j 關鍵操作 鬆弛 void relax int i,int j,int k floyd void floyd 複雜度o v 3 可處理負環 拓展把所有邊存成負的...