算法的基本思想是:每次找到离源点(上面例子的源点就是 1 号顶点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤如下:
Floyd算法又称为插点法,理解起来也很方便,复杂度为o(n3),如要从结点1到结点n,可以由1直通n,再逐渐向其中插入其他结点作为中转点,不断更新在插入结点后的最短路径。
代码也很简洁,四行的算法。
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) e[j][k]=min(e[j][i]+e[i][k],e[j][k]);
HDU-3790 最短路径(模板题)
Dijkstra版:
这个算法还能利用堆和优先队列进行优化(但是我不会
下面是没有任何优化的最简单版本
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned long long ull; 5 #define INF 0X3f3f3f3f 6 const ll MAXN = 1e3 + 7; 7 const ll mod = 1e9 + 7; 8 //权值为正 9 int n, m; 10 int vis[MAXN]; 11 int dist[MAXN]; 12 int a[MAXN][MAXN]; 13 void Dijkstra(int x,int y) 14 { 15 for (int i = 1; i <= n; i++) 16 { 17 dist[i] = a[x][i]; 18 vis[i] = 0; 19 } 20 vis[x] = 1; 21 int p; 22 for (int i = 1; i <= n; i++) 23 { 24 int minn = INF; 25 for (int j = 1; j <= n; j++) 26 { 27 if (!vis[j] && dist[j] < minn) 28 { 29 minn = dist[j]; 30 p = j; 31 } 32 } 33 vis[p] = 1; 34 for (int j = 1; j <= n; j++) 35 if (!vis[j] && dist[p] + a[p][j] < dist[j]) 36 dist[j] = dist[p] + a[p][j];//更新这个找到的距离最小的点所连的点的距离 37 } 38 } 39 int main() 40 { 41 ios::sync_with_stdio(false); 42 while (cin >> n >> m && n && m) 43 { 44 memset(a,INF,sizeof(a)); 45 for (int i = 0; i < m; i++) 46 { 47 int x, y, len; 48 cin >> x >> y >> len; 49 a[x][y] = len; 50 a[y][x] = len; //无向图 51 } 52 Dijkstra(1,n); 53 cout << dist[n] << endl; 54 } 55 }
Floyd版:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned long long ull; 5 #define INF 0X3f3f3f3f 6 const ll MAXN = 1e3 + 7; 7 const ll mod = 1e9 + 7; 8 //可处理权值为负的情况 9 int n,m; 10 int e[MAXN][MAXN]; 11 void floyd() 12 { 13 for(int i=1;i<=n;i++) 14 for(int j=1;j<=n;j++) 15 for(int k=1;k<=n;k++) 16 e[j][k]=min(e[j][i]+e[i][k],e[j][k]); 17 } 18 int main() 19 { 20 while(cin>>n>>m&&n&&m) 21 { 22 memset(e,INF,sizeof(e)); 23 for(int i=0;i<m;i++) 24 { 25 int a,b,c; 26 cin>>a>>b>>c; 27 e[a][b]=c; 28 e[b][a]=c; 29 } 30 floyd(); 31 cout<<e[1][n]<<endl; 32 } 33 return 0; 34 }
原文:https://www.cnblogs.com/graytido/p/10587084.html