/*

数据结构C语言版 弗洛伊德算法 
 P191
 编译环境:Dev-C++ 4.9.9.2

*/

#include <stdio.h>
#include <limits.h>

#define MAX_NAME 5   // 顶点字符串的最大长度+1
#define MAX_INFO 20   // 相关信息字符串的最大长度+1
typedef int VRType;   // 顶点关系的数据类型
#define INFINITY INT_MAX // 用整型最大值代替∞
#define MAX_VERTEX_NUM 20 // 最大顶点个数 
typedef char InfoType;  // 信息的类型
typedef char VertexType[MAX_NAME]; // 顶点数据类型及长度
typedef enum{DG, DN, AG, AN} GraphKind; // {有向图,有向网,无向图,无向网}

// 邻接矩阵的数据结构
typedef struct
{
 VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; 
    // 对带权图,则为权值类型 
 InfoType *info; // 该弧相关信息的指针(可无) 
 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

// 图的数据结构
typedef struct
{
 VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量
 AdjMatrix arcs;  // 邻接矩阵
 int vexnum,   // 图的当前顶点数
  arcnum;   // 图的当前弧数
 GraphKind kind;  // 图的种类标志
} MGraph;

typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef int DistancMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

// 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
int LocateVex(MGraph G,VertexType u)
{
 int i;
 for(i = 0; i < G.vexnum; ++i)
  if( strcmp(u, G.vexs[i]) == 0)
   return i;
 return -1;
}

// 采用数组(邻接矩阵)表示法,构造有向网G。
int CreateDN(MGraph *G)
{
 int i,j,k,w,IncInfo;
 char s[MAX_INFO],*info;
 VertexType va,vb;

printf("请输入有向网G的顶点数,弧数,弧是否含其它信息(是:1,否:0):"
  " (空格隔开)\n");
 scanf("%d%d%d%*c", &(*G).vexnum, &(*G).arcnum, &IncInfo);
 
 printf("请输入%d个顶点的值(<%d个字符):\n", (*G).vexnum, MAX_NAME);
 for(i=0;i<(*G).vexnum;++i)  // 构造顶点向量
  scanf("%s%*c",(*G).vexs[i]);
 for(i=0;i<(*G).vexnum;++i)  // 初始化邻接矩阵
  for(j=0;j<(*G).vexnum;++j)
  {
   (*G).arcs[i][j].adj=INFINITY; // 网,边的权值初始化为无穷大 
   (*G).arcs[i][j].info=NULL;
  }
 
 printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n",(*G).arcnum);
 for(k=0;k<(*G).arcnum;++k)
 {
  scanf("%s%s%d%*c",va,vb,&w);  // %*c吃掉回车符 
  i=LocateVex(*G,va);
  j=LocateVex(*G,vb);
  (*G).arcs[i][j].adj=w; // 有向网,弧的权值为w 
  if(IncInfo)
  {
   printf("请输入该弧的相关信息(<%d个字符): ",MAX_INFO);
   scanf("%s%*c", s);
   w = strlen(s);
   if(w)
   {
    info=(char*)malloc((w+1)*sizeof(char));
    strcpy(info,s);
    (*G).arcs[i][j].info=info; // 有向 
   }
  }
 }
 (*G).kind=DN; //有向网的种类标志
 return 1;
}

// 算法7.16
// 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其 
// 带权长度D[v][w]。若P[v][w][u]为1,则u是从v到w当前求得最短 
// 路径上的顶点。
void ShortestPath_FLOYD(MGraph G,PathMatrix *P,DistancMatrix *D)

 int u,v,w,i;
 for(v=0;v<G.vexnum;v++) // 各对结点之间初始已知路径及距离 
  for(w=0;w<G.vexnum;w++)
  {
   (*D)[v][w]=G.arcs[v][w].adj;
   for(u=0;u<G.vexnum;u++)
    (*P)[v][w][u]=0;
   if((*D)[v][w]<INFINITY) // 从v到w有直接路径 
   {
    (*P)[v][w][v]=1;
    (*P)[v][w][w]=1;
   }
  }
 for(u=0;u<G.vexnum;u++)
  for(v=0;v<G.vexnum;v++)
   for(w=0;w<G.vexnum;w++)
    // 从v经u到w的一条路径更短 
    if((*D)[v][u]+(*D)[u][w]<(*D)[v][w])
    {
     (*D)[v][w]=(*D)[v][u]+(*D)[u][w];
     for(i=0;i<G.vexnum;i++)
      (*P)[v][w][i]=(*P)[v][u][i]||(*P)[u][w][i];
    }
}

int main()
{
 MGraph g;
 int i,j,k,l,m,n;
 PathMatrix p;
 DistancMatrix d;
 
 CreateDN(&g);
 for(i=0;i<g.vexnum;i++)
  g.arcs[i][i].adj=0; // ShortestPath_FLOYD()要求对角元素值为0 
 printf("邻接矩阵:\n");
 for(i=0;i<g.vexnum;i++)
 {
  for(j=0;j<g.vexnum;j++)
   printf("%11d",g.arcs[i][j]);
  printf("\n");
 }
 ShortestPath_FLOYD(g,&p,&d);
 printf("d矩阵:\n");
 for(i=0;i<g.vexnum;i++)
 {
  for(j=0;j<g.vexnum;j++)
   printf("%6d",d[i][j]);
  printf("\n");
 }
 for(i=0;i<g.vexnum;i++)
  for(j=0;j<g.vexnum;j++)
   printf("%s到%s的最短距离为%d\n",g.vexs[i],g.vexs[j],d[i][j]);
 printf("p矩阵:\n");
 l=strlen(g.vexs[0]); // 顶点向量字符串的长度 
 for(i=0;i<g.vexnum;i++)
 {
  for(j=0;j<g.vexnum;j++)
  {
   if(i!=j)
   {
    m=0; // 占位空格 
    for(k=0;k<g.vexnum;k++)
     if(p[i][j][k]==1)
      printf("%s",g.vexs[k]);
    else
     m++;
    for(n=0;n<m*l;n++) // 输出占位空格 
     printf(" ");
   }
   else
    for(k=0;k<g.vexnum*l;k++) // 输出占位空格 
     printf(" ");
   printf("   "); // 输出矩阵元素之间的间距 
  }
  printf("\n");
 }

system("pause");
 return 0; 
}

/*
输出效果:

请输入有向网G的顶点数,弧数,弧是否含其它信息(是:1,否:0): (空格隔开)
3 5 0
请输入3个顶点的值(<5个字符):
V0
V1
V2
请输入5条弧的弧尾 弧头 权值(以空格作为间隔):
V0 V1 4
V0 V2 11
V1 V0 6
V1 V2 2
V2 V0 3
邻接矩阵:
          0          4         11
          6          0          2
          3 2147483647          0
d矩阵:
     0     4     6
     5     0     2
     3     7     0
V0到V0的最短距离为0
V0到V1的最短距离为4
V0到V2的最短距离为6
V1到V0的最短距离为5
V1到V1的最短距离为0
V1到V2的最短距离为2
V2到V0的最短距离为3
V2到V1的最短距离为7
V2到V2的最短距离为0
p矩阵:
         V0V1     V0V1V2
V0V1V2            V1V2
V0V2     V0V1V2
请按任意键继续. . .

*/

数据结构C语言版 弗洛伊德算法实现的更多相关文章

  1. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  2. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  3. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  4. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  5. 0.数据结构(python语言) 基本概念 算法的代价及度量!!!

    先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...

  6. 深入浅出数据结构C语言版(1)——什么是数据结构及算法

    在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...

  7. 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度

    所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...

  8. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

  9. 深入浅出数据结构C语言版(17)——有关排序算法的分析

    这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什 ...

随机推荐

  1. ie的selectNodes函数和firefox的document.evaluate

    selectNodes() 方法用一个 XPath 查询选择节点. nodeObject.selectNodes(query)query  XPath 查询串. 包含了匹配查询的节点的一个 NodeL ...

  2. perl5 第五章 文件读写

    第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件   语法为open (filevar, file ...

  3. poj 3630 Phone List(字典树)

    题目链接: http://poj.org/problem?id=3630 思路分析: 求在字符串中是否存在某个字符串为另一字符串的前缀: 即对于某个字符串而言,其是否为某个字符串的前缀,或存在某个其先 ...

  4. windows XP 安装pip

    1.首先安装Python 2.添加环境变量 我的是 path = C:\Python27 3.下载setuptools 这里可参考这篇博文,附带资源的:http://blog.csdn.net/sud ...

  5. iOS开展-CocoaPods安装和使用教程

    原文链接: iOS开展-CocoaPods安装和使用教程 修正已经增加了自己的理解. CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.co ...

  6. Objective-c 方法的调用

    在书写了类的声明和实现后,应用程序如何去调用它呢? 在Objective-c中,调用方法的简单格式如下: 1⃣   [实例  方法];    如: [person setAge:32];  其中 pe ...

  7. 【企业库6】【日志应用程序块】实验2:创建和使用异步Trace Listener

    Lab 2: Create and Use an Asynchronous Trace Listener 实验2:创建和使用异步Trace Listener In this lab, you will ...

  8. CodeFirst-Section1之小例子

    尽可能做到不说一些晦涩难懂的语言,Follow Me...... 环境:Visual Studio 2013+.Net Framework 4.5 1.什么是Code First? 说白了就是先建好C ...

  9. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  10. [Swust OJ 797]--Palindromic Squares(回文数水题)

    题目链接:http://acm.swust.edu.cn/problem/797/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...