_DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 100000		//定义一个无限大的值
#define MaxSize 50	//最大顶点个数
typedef int PathMatrix[MaxSize][MaxSize][MaxSize];	//定义一个保存最短路径的二维数组
typedef int ShortPathLength[MaxSize][MaxSize];	//定义一个保存从顶点v0到顶点v的最短距离的数组
typedef enum{DG,DN,UG,UN}GraphKind;
typedef struct{
	VRType adj;		//对于无权图,用1表示相邻,0表示不相邻;对于带权图,存储权值
	InfoPtr *info;	//与弧或边的相关信息
}ArcNode,AdjMatrix[MaxSize][MaxSize];
//图的类型定义
typedef struct{
	VertexType vex[MaxSize];	//用于存储顶点
	AdjMatrix arc;		//邻接矩阵,存储边或弧的信息
	int vexnum,arcnum;	//顶点数和边(弧)的数目
	GraphKind kind;	//图的类型
}MGraph;
//添加一个存储网的行、列和权值的类型定义
typedef struct{
	int row;
	int col;
	int weight;
}GNode;
//采用邻接矩阵表示法创建有向网N
void CreateGraph(MGraph *N,GNode *value,int vnum,int arcnum,VertexType *ch){
	int i,j,k,w;
	char s[MaxSize];
	VertexType v1,v2;
	N->vexnum=vnum;
	N->arcnum=arcnum;
	for(i=0;i<vnum;i++)
		strcpy(N->vex[i],ch[i]);
	//初始化邻接矩阵
	for(i=0;i<N->vexnum;i++)
		for(j=0;j<N->vexnum;j++){
			N->arc[i][j].adj=INFINITY;
			N->arc[i][j].info=NULL;	//弧的信息初始化为空
		}
		for(k=0;k<arcnum;k++){
			i=value[k].row;
			j=value[k].col;
			N->arc[i][j].adj=value[k].weight;
		}
		N->kind=DN;	//图的类型为有向网
}
//输出邻接矩阵存储表示的图N
void DisplayGraph(MGraph N){
	int i,j;
	printf("有向网具有%d个顶点%d条弧,顶点依次是: ",N.vexnum,N.arcnum);
	for(i=0;i<N.vexnum;++i)				/*输出网的顶点*/
		printf("%s ",N.vex[i]);
	printf("\n有向网N的:\n");			/*输出网N的弧*/
	printf("序号i=");
	for(i=0;i<N.vexnum;i++)
		printf("%11d",i);
	printf("\n");
	for(i=0;i<N.vexnum;i++)
	{
		printf("       %-6d   ",i);
		for(j=0;j<N.vexnum;j++)
			printf("%-11d",N.arc[i][j].adj);
		printf("\n");
	}
}
//用Floyd算法求有向网N的各顶点v和w之间的最短路径,其中path[v][w][u]表示u是从v到w当前求得最短路径上的顶点
void Floyd(MGraph N,PathMatrix path,ShortPathLength dist){
	int u,v,w,i;
	for(v=0;v<N.vexnum;v++)		//初始化数组path和dist
		for(w=0;w<N.vexnum;w++){
			dist[v][w]=N.arc[v][w].adj;	//初始时,顶点v到顶点w的最短路径为v到w的弧的权值
			for(u=0;u<N.vexnum;u++)
				path[v][w][u]=0;	//路径矩阵初始化为零
			if(dist[v][w]<INFINITY){	//如果v到w有路径,则由v到w的路径经过v和w两点
				path[v][w][v]=1;
				path[v][w][w]=1;
			}
		}
	for(u=0;u<N.vexnum;u++)
		for(v=0;v<N.vexnum;v++)
			for(w=0;w<N.vexnum;w++)
				if(dist[v][u]<INFINITY&&dist[u][w]<INFINITY&&(dist[v][u]+dist[u][w]<dist[v][w])){	//从v经u到w的一条路径为当前最短的路径
					dist[v][w]=dist[v][u]+dist[u][w];	//更新v到w的最短路径
					for(i=0;i<N.vexnum;i++) 	//从v到w的路径经过从v到u和从u到w的所有路径
						path[v][w][i]=path[v][u][i]||path[u][w][i];
				}
}
void main(){
	int w,u,v,vnum=3,arcnum=4;
	MGraph N;
	GNode value[]={{0,1,5},{1,0,10},{1,2,6},{2,0,9}};
	VertexType ch[]={"v0","v1","v2"};
	PathMatrix path;						/*用二维数组存放最短路径所经过的顶点*/
	ShortPathLength dist;					/*用一维数组存放最短路径长度*/
	CreateGraph(&N,value,vnum,arcnum,ch); /*创建有向网N*/
	for(v=0;v<N.vexnum;v++)
		N.arc[v][v].adj=0;				/*弗洛伊德算法要求对角元素值为0,因为两点相同,其距离为0 */
	DisplayGraph(N);					/*输出有向网N*/
	Floyd(N,path,dist);
	printf("顶点之间的最短路径长度矩阵dist:\n");
	for(u=0;u<N.vexnum;u++)
	{
		for(v=0;v<N.vexnum;v++)
			printf("%6d",dist[u][v]);
		printf("\n");
	}
	for(u=0;u<N.vexnum;u++)
		for(v=0;v<N.vexnum;v++)
			if(u!=v)
				printf("%s到%s的最短距离为%d\n",N.vex[u],N.vex[v],dist[u][v]);
	printf("各顶点之间的最短路径所经过的顶点:\n");
	for(u=0;u<N.vexnum;u++)
		for(v=0;v<N.vexnum;v++)
			if(u!=v)
			{
				printf("由%s到%s经过:",N.vex[u],N.vex[v]);
				for(w=0;w<N.vexnum;w++)
					if(path[u][v][w]==1)
						printf("%s ",N.vex[w]);
				printf("\n");
			}
	system("pause");
}

版权声明:本文为博主原创文章,未经博主允许不得转载|Copyright ©2011-2015,Supernatural, All Rights Reserved.

时间: 2024-07-30 10:14:31

_DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径的相关文章

_DataStructure_C_Impl:Dijkstra算法求最短路径

// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int P

FLOyd算法 求任意最短路

此算法由Robert W. Floyd(罗伯特·弗洛伊德)于1962年发表在"Communications of the ACM"上.同年Stephen Warshall(史蒂芬·沃舍尔)也独立发表了这个算法.Robert W.Floyd这个牛人是朵奇葩,他原本在芝加哥大学读的文学,但是因为当时美国经济不太景气,找工作比较困难,无奈之下到西屋电气公司当了一名计算机操作员,在IBM650机房值夜班,并由此开始了他的计算机生涯. 作者:ahalei来源:51CTO博客|2014-03-26

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两点间的最短路径算法,称为多源最短路径算法. 常用的路径算法有: Dijkstra算法 SPFA算法\Bellman-Ford算法 Floyd算法\Floyd-Warshall算法 Johnson算法 其中最经典的是Dijkstra算法和Floyd算法.Floyd算法是多源最短路径算法,可以直接求出图

Floyd 算法求多源最短路径

Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环. 基本算法: Floyd算法基于动态规划的思想,以 u 到 v 的最短路径至少经过前 k 个点为转移状态进行计算,通过 k 的增加达到寻找最短路径的目的.当 k 增加 1 时,最短路径要么不边,如果改变,必经过第 k 各点,也就是说当起点 u 到第 k 个点的最短距离加上第 k 个点到终点 v 的最短路径小于不经过第 k 个节点的最优最短路经长度的时候更新

设计一个算法,求不权无向图连通图G中距离顶点v的最远的一个顶点

思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点.利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, -,最后到达的一个顶点k即为距离v最远的顶点.遍历时利用队列逐层暂存各个顶点,最后出队的一个顶点k即为所求.如图所示: 对应的算法如下: int Maxdist(AGragh *G,int v) { ArcNode *p; int Qu[MAXV]; //循环队列 int front=0,rea

Floyd算法求多源最短路径

#include<stdio.h> int main() { int m, n, i, j, k, t1, t2, t3, e[10][10]; scanf_s("%d %d", &n, &m); for (i = 1; i <= n;i++) for (j = 1; j <= n; j++)//Initialize the matrix { if (i == j) e[i][j] = 0; else e[i][j] = 99999; } for

Floyd算法应用-医院选址问题

1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近? 2) 基本要求 (1) 建立模型,设计存储结构: (2) 设计算法完成问题求解: (3) 分析算法的时间复杂度. 3) 设计思想 医院选址问题实际是求有向图中心点的问题.首先定义顶点的偏心度. 设图G=(V,E),对任一顶点k,称E(k)=max{d(i, k)}(i∈V)

医院选址问题【Floyd算法】

1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近? 2) 基本要求 (1) 建立模型,设计存储结构: (2) 设计算法完成问题求解: (3) 分析算法的时间复杂度. 3) 设计思想 医院选址问题实际是求有向图中心点的问题.首先定义顶点的偏心度. 设图G=(V,E),对任一顶点k,称E(k)=max{d(i, k)}(i∈V)

(转)最短路径Floyd算法

本文转自:https://blog.csdn.net/jack_20/article/details/78031310 Floyd算法求所有顶点到所有顶点的最短路径,时间复杂度也为O(n^3),但其算法非常简洁优雅.为了能讲明白该算法的精妙所在,先来看最简单的案例. 下图左部分是一个最简单的3个顶点连通网图. 先定义两个数组D[3][3]和P[3][3],D代表顶点到顶点的最短路径权值和的矩阵,P代表对应顶点的最小路径的前驱矩阵.在未分析任何顶点之前,我们将D命 名为D-1 ,其实它就是初始的图