_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");
}
_DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径的更多相关文章
- _DataStructure_C_Impl:Dijkstra算法求最短路径
// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...
- 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)
Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- Floyd 算法求多源最短路径
Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环(可根据最小环的正负来判定). 基本算法: Floyd算法基 ...
- Poj 1125 Stockbroker Grapevine(Floyd算法求结点对的最短路径问题)
一.Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a ...
- Floyd算法应用-医院选址问题
1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...
- C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)
1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 最短路径---Dijkstra/Floyd算法
1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...
随机推荐
- POJ1195Mobile phones
二维树状数组板子题. #include<cstdio> #include<cstring> #include<iostream> #include<cstdl ...
- css垂直居中 转
原文发布时间为:2009-07-26 -- 来源于本人的百度文章 [由搬家工具导入] CSS 垂直居中2009-07-24 09:09 前看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CS ...
- 记录: 一次解决整型溢出攻击(使用scala,隐式转换)
最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议 ...
- java 修改类注释
在Windows->Preferences->Java->Code Style->Code Templates 的 Comments中 Types 是控制类的注释 /** * ...
- Android Studio 项目代码运行正常,但是代码爆红处理记录
系统上运行Android项目时,编译正常但是代码爆红,很烦.处理方法记录: clean 项目,执行build. 运行invalidate cache / restart 重启项目. 找到项目.idea ...
- js中click重复执行
问题背景:在写一个非常简单添加方法的时候,用onclick事件调用添加方法,点击第一次没问题,第二次会重复执行,经过多次查找资料得知这个状况的解决方案,特意总结一下: 代码如下:点击#spec_for ...
- Ceres Solver: 高效的非线性优化库(一)
Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...
- POJ 2505 A multiplication game [博弈]
题意:两个人做游戏,每个人都可以在自己的回合里将数p乘以2到9之间的一个数,初始时p=1,谁先将p乘到大于等于n就算赢. 思路:一开始我算sg值,结果算来算去都没算明白... 后来看了别人题解,才豁然 ...
- JDK1.5新特性:
1.自动装箱与拆箱: 自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中. 自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用i ...
- Fresco对Listview等快速滑动时停止加载
Fresco中在listview之类的快速滑动时停止加载,滑动停止后恢复加载: 1.设置图片请求是否开启 // 暂停图片请求 public static void imagePause() { Fre ...