最短路径Floyd详解-源代码

//算法6.11 弗洛伊德算法

#include <iostream>
using namespace std;

#define MaxInt 32767                    	//表示极大值,即∞
#define MVNum 100                       	//最大顶点数

typedef char VerTexType;              		//假设顶点的数据类型为字符型
typedef int ArcType;                  		//假设边的权值类型为整型 

int Path[MVNum][MVNum];						//最短路径上顶点vj的前一顶点的序号
int D[MVNum][MVNum];						//记录顶点vi和vj之间的最短路径长度

//------------图的邻接矩阵---------------
typedef struct{
	VerTexType vexs[MVNum];            		//顶点表
	ArcType arcs[MVNum][MVNum];      		//邻接矩阵
	int vexnum,arcnum;                		//图的当前点数和边数
}AMGraph;

int LocateVex(AMGraph G , VerTexType v){
	//确定点v在G中的位置
	for(int i = 0; i < G.vexnum; ++i)
		if(G.vexs[i] == v)
			return i;
		return -1;
}//LocateVex

void CreateUDN(AMGraph &G){
    //采用邻接矩阵表示法,创建有向网G
	int i , j , k;
	cout <<"请输入总顶点数,总边数,以空格隔开:";
    cin >> G.vexnum >> G.arcnum;							//输入总顶点数,总边数
	cout << endl;

	cout << "输入点的名称,如a" << endl;

    for(i = 0; i < G.vexnum; ++i){
		cout << "请输入第" << (i+1) << "个点的名称:";
		cin >> G.vexs[i];                        			//依次输入点的信息
	}
	cout << endl;
    for(i = 0; i < G.vexnum; ++i){                			//初始化邻接矩阵,边的权值均置为极大值MaxInt
		for(j = 0; j < G.vexnum; ++j){
			if(j != i)
				G.arcs[i][j] = MaxInt;
			else
				G.arcs[i][j] = 0;
		}//for
	}//for

	cout << "输入边依附的顶点及权值,如a b 3" << endl;
	for(k = 0; k < G.arcnum;++k){						//构造邻接矩阵
		VerTexType v1 , v2;
		ArcType w;
		cout << "请输入第" << (k + 1) << "条边依附的顶点及权值:";
		cin >> v1 >> v2 >> w;                           //输入一条边依附的顶点及权值
		i = LocateVex(G, v1);  j = LocateVex(G, v2);	//确定v1和v2在G中的位置,即顶点数组的下标
		G.arcs[i][j] = w;								//边<v1, v2>的权值置为w
	}//for
}//CreateUDN 

void ShortestPath_Floyed(AMGraph G){
    //用Floyd算法求有向网G中各对顶点i和j之间的最短路径
	int i , j , k ;
    for (i = 0; i < G.vexnum; ++i)          		//各对结点之间初始已知路径及距离
        for(j = 0; j < G.vexnum; ++j){
            D[i][j] = G.arcs[i][j];
            if(D[i][j] < MaxInt && i != j)  Path[i][j]=i;  	//如果i和j之间有弧,则将j的前驱置为i
            else Path [i][j] = -1;              		//如果i和j之间无弧,则将j的前驱置为-1
		}//for
		for(k = 0; k < G.vexnum; ++k)
			for(i = 0; i < G.vexnum; ++i)
				for(j = 0; j < G.vexnum; ++j)
					if(D[i][k] + D[k][j] < D[i][j]){   		//从i经k到j的一条路径更短
						D[i][j] = D[i][k]+D[k][j];    		//更新D[i][j]
						Path[i][j] = Path[k][j];       			//更改j的前驱为k
					}//if
}//ShortestPath_Floyed

void DisplayPath(AMGraph G , int begin ,int temp ){
	//显示最短路径
	if(Path[begin][temp] != -1){
		DisplayPath(G , begin ,Path[begin][temp]);
		cout << G.vexs[Path[begin][temp]] << "-->";
	}
}//DisplayPath

void main(){
	cout << "************算法6.11 弗洛伊德算法**************" << endl << endl;
	AMGraph G;
	char start , destination;
	int num_start , num_destination;

	CreateUDN(G);

	cout <<endl;
	cout << "有向网G创建完成!" << endl;
	ShortestPath_Floyed(G);

	cout << "请依次输入路径的起点与终点的名称:";
	cin >> start >> destination;
	num_start = LocateVex(G , start);
	num_destination = LocateVex(G , destination);

	DisplayPath(G , num_start , num_destination);
	cout << G.vexs[num_destination] << endl;
	cout << "最短路径的长度为:" << D[num_start][num_destination] << endl;
	cout <<endl;
}//main

时间: 2024-11-18 02:55:12

最短路径Floyd详解-源代码的相关文章

最短路径-Dijkstra详解-源代码

//算法6.10 迪杰斯特拉算法 #include <iostream> using namespace std; #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 int *D=new int[MVNum]; //用于记录最短路的长度 bool *S=new bool[MVNu

SSH登录与增删改查demo详解+源代码

点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679   一.框架概述 spring+Struts2+hibernate(SSH)整合框架是一种非常典型与实用的Web项目MVC架构,其中: Spring主要通过控制反转(IOC)与依赖注入(DI)控制对象的创建与维护,与实现面向切片编程(AOP),核心配置文件为:applicationContext.xml. Struts2是M

Dijkstra 最短路径算法详解 无向图

对于最短路径问题,这里介绍一种O(N^2)的求解方法. 对于求最短路径的问题一般都会给出一幅图,或者边与边的关系.如上图. 假设我们起点是A,我们要求到F的最短距离,我们会怎么做? 首先,因为A是起点,所以我们把对于每个点都有个参数,相对于A的距离,默认除了A到A为0,其他都是无穷大. 从起点A开始,我们更新与A相连通的点到A的距离,并把A点标记.如图: 我们遍历一次所有点与A的距离,找到最小的,这里是点B. 以它为起点,把它周围未被标记的点拿来做比较,显然,像F这种没有与A练过的点,当前距离就

Floyd详解

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1][2]

Flex3与java BlazeDS入门教程及其配置详解

原文:Flex3与java BlazeDS入门教程及其配置详解 源代码下载地址:http://www.zuidaima.com/share/1789445387160576.htm BlazeDS的下载和介绍: http://opensource.adobe.com/wiki/display/blazeds/Release+Builds(已经失效) 新的下载路径:http://sourceforge.net/adobe/wiki/Projects/或是http://www.pc6.com/sof

struts2标签库详解

原文:struts2标签库详解 源代码下载地址:http://www.zuidaima.com/share/1781606927846400.htm 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 bo

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 之前已经对Dijkstra算法做了介绍(不懂的可以看这篇博客:Dijkstra算法详解),所以这篇博客打算对Floyd算法做

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

挂钩SSDT详解附源代码

源代码下载地址:挂钩SSDT源代码 据微软所言,服务描述符表是一个由四个结构组成的数组,其中的每一个结构都是由四个双字项组成.因此,我们可以将服务描述符表表示为: typedef struct ServiceDescriptorTable { SDE ServiceDescriptor[4]; }SDT; 其中,其中的每一个服务描述符呈现出四个双字的形式,它的结构为: #pragma pack(1) typedef struct ServiceDescriptorEntry { unsigned