多源最短路径Floyd算法
2016-11-27 19:58
316 查看
设d[i][j]为顶点 i 与顶点 j 的最短路径,设 k为i与j之间的点,那么d[i][j] = d[i][k] + d[k][j];
算法核心为:
void floyd()
{
int i,j,k;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][k] + d[k][j] < d[i][j])
{
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
}
}
}path[i][j]记录的是最短路径中到j的上一个点,初始化为-1,若最后path[i][j] = -1,说明j是与源点i相邻的点
例:
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
#define NUM 101
#define INF 99999999
int d[NUM][NUM];
int path[NUM][NUM];
int n,m;
void floyd()
{
int i,j,k;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][k] + d[k][j] < d[i][j])
{
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
}
}
}
void findPre(int i,int j)
{
cout<<j<<"-";
if(path[i][j] == -1)
{
cout<<i;
return;
}
else
{
findPre(i,path[i][j]);
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
d[i][j] = INF;
path[i][j] = -1;
}
}
for(i = 1; i <= m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
d[a][b] = d[b][a] = c;
}
floyd();
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][j] < INF && i == 1 && j != 1)
{
printf("%d到%d的最短路径为:%d ",i,j,d[i][j]);
printf("路径为:");
findPre(i,j);
printf("\n");
}
}
}
system("pause");
return 0;
}
算法核心为:
void floyd()
{
int i,j,k;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][k] + d[k][j] < d[i][j])
{
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
}
}
}path[i][j]记录的是最短路径中到j的上一个点,初始化为-1,若最后path[i][j] = -1,说明j是与源点i相邻的点
例:
#include<iostream>
#include<vector>
#include<windows.h>
using namespace std;
#define NUM 101
#define INF 99999999
int d[NUM][NUM];
int path[NUM][NUM];
int n,m;
void floyd()
{
int i,j,k;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][k] + d[k][j] < d[i][j])
{
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
}
}
}
void findPre(int i,int j)
{
cout<<j<<"-";
if(path[i][j] == -1)
{
cout<<i;
return;
}
else
{
findPre(i,path[i][j]);
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
d[i][j] = INF;
path[i][j] = -1;
}
}
for(i = 1; i <= m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
d[a][b] = d[b][a] = c;
}
floyd();
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(d[i][j] < INF && i == 1 && j != 1)
{
printf("%d到%d的最短路径为:%d ",i,j,d[i][j]);
printf("路径为:");
findPre(i,j);
printf("\n");
}
}
}
system("pause");
return 0;
}
相关文章推荐
- 加权有向图----多源最短路径问题(Floyd算法)
- 多源最短路径--floyd算法
- Floyd算法:用动态规划求解多源(全源)最短路径
- 多源最短路径( Floyd算法)JAVA实现
- Floyd算法--多源最短路径
- 多源有权图的最短路径 floyd算法(动态规划能解决负权边)7.1.3
- 多源最短路径之Floyd算法
- Floyd算法求多源最短路径
- 算法基础 - 多源点最短路径(Floyd算法)
- 多源最短路径Floyd算法
- floyd算法求多源最短路径
- 多源最短路径floyd算法
- 医院设置(多源最短路径--Floyd算法)
- 无权图单源最短路径算法和有权图单源最短路径算法(用到Dijkstra算法)和多源最短路径算法(用到Floyd算法)
- POJ 1125 (多源最短路径—Floyd算法)
- 最短路径基本介绍(1)--Floyd算法(多源最短路径,五行代码)
- 【转载】最短路径—Dijkstra算法和Floyd算法
- 最小生成树(Prime算法、Kruskal算法)和最短路径算法(Floyd算法、DijKstra算法)
- 【算法设计与分析】全源最短路径的Floyd算法
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)