Floyd(弗洛伊德算法)---每对顶点的最短路径---《数据结构》严蔚敏

// exam1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;

#define MAXVEX 20
#define INT_MAX 10000

typedef struct ArcNode
{
	int adj;
	void* info;
}ArcNode;

typedef ArcNode AdjMat[MAXVEX][MAXVEX];

typedef struct
{
	int vexnum;
	int arcnum;
	AdjMat am;
}Graph;

void InitGraph(Graph& G)
{
	cout<<"Please enter the number of vertex:"<<endl;
	cin>>G.vexnum;
	cout<<"Please enter the Arc of the graph:"<<endl;
	cout<<"head tail weight"<<endl;

	for(int i=0;i<G.vexnum;i++)
	{
		for(int j=0;j<G.vexnum;j++)
		{
			if(i==j)
			{
				G.am[i][j].adj=0;
			}
			else
			{
				G.am[i][j].adj=INT_MAX;
			}
		}
	}

	int vex1,vex2,w;
	while(cin>>vex1>>vex2>>w)
	{
		G.am[vex1][vex2].adj=w;
	}
}

void ShortestPath_FLOYD(Graph G,bool*** &path,int** &D)
{
	path=(bool***)malloc(G.vexnum*sizeof(bool**));
	for(int i=0;i<G.vexnum;i++)
	{
		path[i]=(bool**)malloc(sizeof(bool*)*G.vexnum);
	}
	for(int i=0;i<G.vexnum;i++)
	{
		for(int j=0;j<G.vexnum;j++)
		{
			path[i][j]=(bool*)malloc(G.vexnum*sizeof(bool));
		}
	}

	D=(int**)malloc(G.vexnum*sizeof(int*));
	for(int i=0;i<G.vexnum;i++)
	{
		D[i]=(int*)malloc(G.vexnum*sizeof(int));
	}

	for(int i=0;i<G.vexnum;i++)
	{
		for(int j=0;j<G.vexnum;j++)
		{
			D[i][j]=INT_MAX;
			for(int k=0;k<G.vexnum;k++)
			{
				path[i][j][k]=false;
			}
			if(G.am[i][j].adj<INT_MAX)
			{
				D[i][j]=G.am[i][j].adj;
				path[i][j][i]=true;
				path[i][j][j]=true;
			}
		}
	}

	for(int k=0;k<G.vexnum;k++)
	{
		for(int i=0;i<G.vexnum;i++)
		{
			for(int j=0;j<G.vexnum;j++)
			{
				if(D[i][k]+D[k][j]<D[i][j])
				{
					D[i][j]=D[i][k]+D[k][j];

					for(int m=0;m<G.vexnum;m++)
					{
						path[i][j][m]=path[i][k][m] || path[k][j][m];
					}
				}
			}
		}
	}
}

void show_result(Graph G,bool***path,int**D)
{
	cout<<"The distance matrix is:"<<endl;
	for(int i=0;i<G.vexnum;i++)
	{
		for(int j=0;j<G.vexnum;j++)
		{
			cout<<D[i][j]<<" ";
		}
		cout<<endl;
	}

	cout<<"The path among nodes arw"<<endl;

	for(int i=0;i<G.vexnum;i++)
	{
		for(int j=0;j<G.vexnum;j++)
		{
			cout<<"The path between v"<<i<<" and v"<<j<<" is:"<<endl;
			for(int k=0;k<G.vexnum;k++)
			{
				cout<<path[i][j][k]<<" ";
			}
			cout<<endl<<"------------------------------------------------"<<endl;
		}
	}
}

int main(void)
{
	Graph G;
	InitGraph(G);

	bool ***path;
	int **D;
	ShortestPath_FLOYD(G,path,D);

	show_result(G,path,D);

	system("pause");
	return 0;
}


Floyd(弗洛伊德算法)---每对顶点的最短路径---《数据结构》严蔚敏

时间: 2024-10-18 01:33:30

Floyd(弗洛伊德算法)---每对顶点的最短路径---《数据结构》严蔚敏的相关文章

[数据结构严蔚敏]线性表-算法2.1

/*algorithm-2.1.c*/ 1 #include<stdio.h> 2 #include<linear_list_ADT.h> 3 4 int main(void){ 5 List LA,LB; 6 int LA_len,LB_len; 7 InitList(&LA); 8 InitList(&LB); 9 /*********get LIST_A***********/ 10 printf("please input length of LA

数据结构(严蔚敏)算法2.3-算法2.4

1 //线性表的插入与删除 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define LIST_INIT_SIZE 100 //线性表存储空间的初试分配量 5 #define LISTINCREMENT 10 //线性表存储空间的分配增量 6 #define ERROR 0 7 #define OK 1 8 typedef struct{ 9 int *elem; //存储空间的基址 10 int length;//当前长度 11 i

最短路径之弗洛伊德算法(Floyd)

Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法. 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵. 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归的进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1): 又用同样地公式由D(1)构造出D(2):--:最后又用同样的公式由D(n-1)构造出矩阵D(n).矩阵D(n) 的 i 行 j 列元素便是 i 号顶点到 j 号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后

算法:最短路径之弗洛伊德(Floyd)算法

https://cloud.tencent.com/developer/article/1012420 为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点的最短路径权值和的矩阵.P代表对应顶点的最短路径的前驱矩阵.在未分析任何顶点之前,我们将D命名为D(-1),其实它就是初始图的邻接矩阵.将P命名为P(-1), 初始化为图中的矩阵. 首先我们来分析

每一对顶点间最短路径的Floyd算法

Floyd思想可用下式描述: A-1[i][j]=gm[i][j] A(k+1)[i][j]=min{Ak[i][j],Ak[i][k+1]+Ak[K+1][j]}    -1<=k<=n-2 该式是一个迭代公式,Ak表示已考虑顶点0,1,.......,k等k+1个顶点之后各顶点之间的最短路径,即Ak[i][j]表示由Vi到Vj已考虑顶点0,1,.......,k等k+1个顶点的最短路径;在此基础上再考虑顶点k+1并求出各顶点在考虑了顶点k+1之后的最短路径,即得到Ak+1.每迭代一次,在从

最短路径--弗洛伊德算法[求任意一对顶点间的最短路径]

转自大神:https://www.cnblogs.com/wangyuliang/p/9216365.html !!!!!!!!!!!!!!!!!!!!!!!!!注意             迪杰斯特拉算法和弗洛伊德算法(求最短路径) 都是有向图!!!!单边的 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向

Floyd算法(弗洛伊德算法)

算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1):又用同样地公式由D(1)构造出D(2):……:最后又用同样的公式由D(n-1)构造出矩阵D(n).矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径. 核心思路:通过一个图

数据结构(五)图---最短路径(弗洛伊德算法)

一:定义 弗洛伊德算法是用来求所有顶点到所有顶点的时间复杂度. 虽然我们可以直接对每个顶点通过迪杰斯特拉算法求得所有的顶点到所有顶点的时间复杂度,时间复杂度为O(n*3),但是弗洛伊德算法更加简洁优雅 二:弗洛伊德的使用介绍 若是求一个顶点到其他顶点的最短距离,例如迪杰斯特拉算法,我们的距离数组和路径数组使用一维即可,但是我们这里是获取所有顶点到其余顶点的最短距离,所以我们对于数组和路径都需要使用二维数组来表示 下面我们使用一个有三个顶点的图来进行讲解: (1)我们先定义两个二维数组D0[3][

[从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第一个顶点是源点,最后一个顶点是终点. 我们讲解两种求最短路径的算法.第一种,从某个源点到其余各顶点的最短路径问题. 1,迪杰斯特拉(Dijkstra)算法 迪杰斯特拉算法是一个按路径长度递增的次序产生最短路径的算法,每次找到一个距离V0最短的点,不断将这个点的邻接点加入判断,更新新加入的点到V0的距