Floyd可以求出任意两点间的最短距离,代码也相对简单,对于稀疏图来说效率也还是不错的,但由于三个for循环导致时间复杂度较高,不适合稠密图。
Floyd算法模板(精简版):
void Floyd() { int dist[maxn][maxn]; // dist存储i到j的最短距离 for(int k = 1; k <= n; k++) for(int i = 1;i <= n; i++) for(int j = 1; j <= n; j++) if(dist[i][k] + dist[k][j] < dist[i][j]) dist[i][j] = dist[i][k] + dist[k][j]; // 不断更新最短距离 }
void floyd() { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { dist[i][j] = map[i][j], path[i][j] = 0; } for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(dist[i][k] + dist[k][j] < dist[i][j]) { dist[i][j] = dist[i][k] + dist[k][j]; path[i][j] = k; // path记录路径中的最大点 } } void output(int i,int j) // 用递归的方式输出路径,i是起点,j是终点 { if(i == j) return; if(path[i][j] == 0) cout<<j<<' '; else { output(i,path[i][j]); output(path[i][j],j); } }
原文:http://blog.csdn.net/userluoxuan/article/details/38169189