#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之间的最短路径的更多相关文章

  1. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

  2. 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)

    Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...

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

    相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...

  4. Floyd 算法求多源最短路径

    Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环(可根据最小环的正负来判定). 基本算法: Floyd算法基 ...

  5. Poj 1125 Stockbroker Grapevine(Floyd算法求结点对的最短路径问题)

    一.Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a ...

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

    1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...

  7. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

  8. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  9. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

随机推荐

  1. VIJOS【1234】口袋的天空

    背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. ...

  2. onbeforeunload 的使用

    原文发布时间为:2008-10-20 -- 来源于本人的百度文章 [由搬家工具导入] onbeforeunload 可以在页面关闭,刷新,跳转时弹出提示信息,防止意外的跳转使得当前页的表单内容被清空。 ...

  3. 【Visual Studio】error c4996: 'fopen': This function or variable may be unsafe(转)

    原文转自 http://blog.csdn.net/zhangyuehuan/article/details/12012635 [解决方案]项目 =>属性 =>c/c++  =>预处 ...

  4. 【eclipse】导入/导出开发环境(包括编辑器字体颜色大小等)

    Eclipse的 File -> Export(导出),在窗口中展开 General(常规) -> Perferences(首选项)-->Export all(全部导出)然后点击 N ...

  5. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---53

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. android实现多条件筛选列表菜单筛选菜单

    封装组合控件实现一个简单的多条件筛选菜单,可根据自己需求定制筛选条件,动态添加筛选项,灵活使用. 控件封装,点击切换,使用popupWindow实现下拉列表,项目中封装了多种数组数据排序处理方法的工具 ...

  7. Sprak RDD简单应用

    来自:http://my.oschina.net/scipio/blog/284957#OSC_h5_11 目录[-] 1.准备文件 2.加载文件 3.显示一行 4.函数运用 (1)map (2)co ...

  8. 【WEB基础】HTML & CSS 基础入门(8)表单

    前面 前面我们已经熟悉了网页上一些常见的元素,如在网页上显示一段文字.一张图片.一个列表.一张表格等等.这些东西都是事先编辑好显示在页面上只提供给用户看的,实际上,我们可以把这样的页面称之为静态页面. ...

  9. 2016北京集训测试赛(十七)Problem B: 银河战舰

    Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...

  10. 【java】Java中十六进制转换 Integer.toHexString()到底做了什么?什么时候会用到它?为什么要用它?byte为什么要&0xff?为什么要和0xff做与运算?

    参考地址:http://www.cnblogs.com/think-in-java/p/5527389.html 参考地址:https://blog.csdn.net/scyatcs/article/ ...