_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也就是求某个源点到目的点的最短路,求解的过程也 ...
随机推荐
- java网络编程学习笔记(三):ServerSocket详解
1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...
- 【ztree】zTree节点增删改
今天遇到一个需求是对zTree的节点进行增删改,经过查阅资料总结如下: 效果: 完成增删改,要注意几个关键点: 使用 编辑功能,必须设置 setting.edit 中的各个属性 使用 编辑功能的事件回 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---15
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 昨天晚上写了个 Python 程序,下载了一个图片网站 5000 来张图片
以前写的,目前已经失效了.. ------------------------------------------------------------------------------------- ...
- python 条件判断 if
条件判断 if 格式-1 if 判断条件: 执行语句... num = 10 if num == 4: print("num 等于4") 执行: C:\Python27\pytho ...
- C#图解教程学习笔记——类和继承
一.屏蔽基类的成员所有类都派生自object类.虽然类只能直接继承一个基类,但继承的层次没有限制.虽然派生类不能删除它继承的任何成员,但可以用与基类同名的成员来屏蔽(mask)基类成员.1. 要屏蔽一 ...
- 在Alfred添加自定义站内搜索
1.Google的站内搜索和渣度的对比,懒得吐槽了 2.在Alfred添加自定义站内搜索步骤 Add Custome Search 把搜索某个关键词的url复制到里面,把url里的关键词替换成{que ...
- Android新特性之CardView的简单使用
Android新特性之CardView的简单使用 我们学习下Android5.0的新增加的控件CardView.首先我们了解一下CardView的基本使用,然后结合RecycleView使用CardV ...
- Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密
1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...
- HDU 5242 Game(树上贪心)
题目链接 Game 题目的意思很简单, 就是要找一棵树权值最大等等前K条链. 在本题中,走的次数等于min(叶子结点个数,k) tree[i].sum意为从i号结点出发走到某个叶子结点能得到的最大总价 ...