最短路徑問題是圖論研究中的乙個經典演算法問題, 旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑
這篇文章就是介紹幾種關於最短路徑的幾種演算法
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 可處理負環 拓展把所有邊存成負的...