您的位置:首页 > 其它

最短路径Dijkstra算法实现和Floyd算法实现

2016-04-05 00:00 429 查看
/*
Dijkstra算方法(时间复杂度O(n^3))
此程序实现由无向图找到源v0到其他节点的最短路径
*/
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define Member 9
#define MAXINT 65535
typedef int shortpath_weight[Member];       //储存V0到各个节点的最短路径的权重和
typedef int shortpath_pre[Member];          //存储最短路径的前驱,如shortpath_pre[1]=5;就表示v0到v1的最短路径中,v1的前驱是v5
void shortest_Dijkstra(Mgraph G,int v0,shortpath_weight *D,shortpath_pre *P)
{
int final[Member];//用final记录一个是否已找到v0到这个节点的最短路径
int i=0,j=0,k=0;
//初始化
for(i=0;i<G.Nodenum;++i)
{
final[i]=0;
(*D)=G.matrix[v0][i];
(*P)=0;
}
(*D)[v0]=0;
final[v0]=1;

//主循环
for(i=0;i<G.Nodenum-1;++i)
{
//找到下一个最短路径节点
for(j=0;j<G.Nodenum;++j)
{
if(!final[j]&&(*D)[j]<min)
{
min=(*D)[j];
k=j;
}
}
final[k]=1;
//由最新找到的节点,更新V0到未找到的最短路径节权值和,以及这些节点在V0到它们的最短路径的前驱
for(j=0;j<G.Nodenum;++j)
{
if(!final[j]&&(min+G.matrix[k][j])<(*D)[j])
{
(*D)[j]=min+G.matrix[j];
(*P)[j]=k;
}
}
}
}

Floyd算法:找到图中所有节点到其他所有节点的最短路径

思路:由图的矩阵,使任意两个节点都通过节点0,如果(*D)[m]
>(*D)[m][0]+(*D)[0]
,则更换(*D)[m]
的值,更换一次矩阵之后,使任意两个节点都通过1(注意此时矩阵已经更新过通过节点0,顾此时的比较相当于,两个节点可以任意通过节点0或者1或者它们的组合的情况下的最短路径值),依次比较通过节点2,3,4.。。。。。最后就是两个节点通过任意节点组合的最短路径

typedef int shortpath_weight[Member][Member]
typedef int shortpath_later[Member][Member]//注意此处用later是因为,此时的矩阵P[2][5]=3表示的是2到5 的话要先经过3,于是再看p[3][5]=4的话,就是2->3->4->....->5

void ShortestPath_Floyd(Mgraph G,shortpath_weight *D,shortpath_later *P)
{
int v,w,k;
//初始化
for(v=0;v<G.Nodenum;++v)
{
for(w=0;w<G.Nodenum;++w)
{
(*D)[v][w]=G.matrix[v][w];
(*P)[v][w]=w;
}
}
//计算最短路径以及路径矩阵
for(k=0;k<G.Nodenum;++k)
{
for(v=0;v<G.Nodenum;++v)
{
for(w=0;w<G.Nodenum;++w)
{
if((*D)[v][w]>(*D)[v][k]+(*D)[k][w])
{
(*D)[v][w]=(*D)[v][k]+(*D)[k][w];
(*P)[v][w]=(*D)[v][k];
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: