问题及代码:

/*
* Copyright(c) 2017,烟台大学计算机学院
* All rights reserved.
* 文件名称:xxy.
* 作    者:徐潇雨
* 完成日期:2017 年 11 月 29 日
* 版 本 号:v1.0
*
* 问题描述:Floyd算法验证
* 输入描述: 无
* 程序输出: 输出各个路径长度
*/
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
#define MaxSize 100
void Ppath(int path[][MAXV],int i,int j)  //前向递归查找路径上的顶点
{int k;k=path[i][j];if (k==-1) return;  //找到了起点则返回Ppath(path,i,k);    //找顶点i的前一个顶点kprintf("%d,",k);Ppath(path,k,j);    //找顶点k的前一个顶点j
}
void Dispath(int A[][MAXV],int path[][MAXV],int n)
{int i,j;for (i=0; i<n; i++)for (j=0; j<n; j++){if (A[i][j]==INF){if (i!=j)printf("从%d到%d没有路径\n",i,j);}else{printf("  从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);printf("%d,",i);    //输出路径上的起点Ppath(path,i,j);    //输出路径上的中间点printf("%d\n",j);   //输出路径上的终点}}
}
void Floyd(MGraph g)
{int A[MAXV][MAXV],path[MAXV][MAXV];int i,j,k;for (i=0; i<g.n; i++)for (j=0; j<g.n; j++){A[i][j]=g.edges[i][j];path[i][j]=-1;}for (k=0; k<g.n; k++){for (i=0; i<g.n; i++)for (j=0; j<g.n; j++)if (A[i][j]>A[i][k]+A[k][j]){A[i][j]=A[i][k]+A[k][j];path[i][j]=k;}}Dispath(A,path,g.n);   //输出最短路径
}
int main()
{MGraph g;int A[4][4]={{0,  5,INF,7},{INF,0,  4,2},{3,  3,  0,2},{INF,INF,1,0}};ArrayToMat(A[0], 4, g);Floyd(g);return 0;
}

graph.h

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED#define MAXV 100                //最大顶点个数
#define INF 32767       //INF表示∞
typedef int InfoType;//以下定义邻接矩阵类型
typedef struct
{int no;                     //顶点编号InfoType info;              //顶点其他信息,在此存放带权图权值
} VertexType;                   //顶点类型typedef struct                  //图的定义
{int edges[MAXV][MAXV];      //邻接矩阵int n,e;                    //顶点数,弧数VertexType vexs[MAXV];      //存放顶点信息
} MGraph;                       //图的邻接矩阵类型//以下定义邻接表类型
typedef struct ANode            //弧的结点结构类型
{int adjvex;                 //该弧的终点位置struct ANode *nextarc;      //指向下一条弧的指针InfoType info;              //该弧的相关信息,这里用于存放权值
} ArcNode;typedef int Vertex;typedef struct Vnode            //邻接表头结点的类型
{Vertex data;                //顶点信息int count;                  //存放顶点入度,只在拓扑排序中用ArcNode *firstarc;          //指向第一条弧
} VNode;typedef VNode AdjList[MAXV];    //AdjList是邻接表类型typedef struct
{AdjList adjlist;            //邻接表int n,e;                    //图中顶点数n和边数e
} ALGraph;                      //图的邻接表类型//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
void DispAdj(ALGraph *G);//输出邻接表G#endif // GRAPH_H_INCLUDED

graph.cpp

#include <stdio.h>
#include <malloc.h>
#include "graph.h"//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g)
{int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数g.n=n;for (i=0; i<g.n; i++)for (j=0; j<g.n; j++){g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)count++;}g.e=count;
}void ArrayToList(int *Arr, int n, ALGraph *&G)
{int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));G->n=n;for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素for (j=n-1; j>=0; j--)if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]{p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*pp->adjvex=j;p->info=Arr[i*n+j];p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*pG->adjlist[i].firstarc=p;}G->e=count;
}void MatToList(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{int i,j;ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素for (j=g.n-1; j>=0; j--)if (g.edges[i][j]!=0)       //存在一条边{p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*pG->adjlist[i].firstarc=p;}G->n=g.n;G->e=g.e;
}void ListToMat(ALGraph *G,MGraph &g)
//将邻接表G转换成邻接矩阵g
{int i,j;ArcNode *p;g.n=G->n;   //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用g.e=G->e;for (i=0; i<g.n; i++)   //先初始化邻接矩阵for (j=0; j<g.n; j++)g.edges[i][j]=0;for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值{p=G->adjlist[i].firstarc;while (p!=NULL){g.edges[i][p->adjvex]=p->info;p=p->nextarc;}}
}void DispMat(MGraph g)
//输出邻接矩阵g
{int i,j;for (i=0; i<g.n; i++){for (j=0; j<g.n; j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");}
}void DispAdj(ALGraph *G)
//输出邻接表G
{int i;ArcNode *p;for (i=0; i<G->n; i++){p=G->adjlist[i].firstarc;printf("%3d: ",i);while (p!=NULL){printf("-->%d/%d ",p->adjvex,p->info);p=p->nextarc;}printf("\n");}
}

运行结果:

第十三周项目1---(4)Floyd算法验证相关推荐

  1. 第十三周项目一(4)——验证平衡二叉树相关算法

    *Copyright(c)2017,烟台大学计算机与控制工程学院 *All rights reservrd. *作者:刘文平 *完成时间:2017年11月23日 *版本号:v1.0 *问题描述:验证平 ...

  2. 第十周项目实践1 二叉树算法验证

    #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED #define MaxSize 100 typedef char ElemType; typedef ...

  3. 数据结构上机实践第八周项目9-广义表算法库及应用

    广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括:  ① 头文glist.h,定义数据类型,声明函数:  ② ...

  4. 数据结构上机实践第八周项目3-顺序串算法

    顺序串算法 本次实践项目要求如下: 采用顺序存储方式存储串,实现下列算法并测试:  (1)试编写算法实现将字符串S中所有值为c1的字符换成值为c2的字符:  void Trans(SqString * ...

  5. 第八周项目实践6 KMP算法(串的模式匹配)

    sqString.h #ifndef SqString_H_INCLUDED #define SqString_H_INCLUDED#define MaxSize 100 //最多的字符个数 type ...

  6. 数据结构上机实践第七周项目2 - 自建算法库——链队(链式队列)

    自建算法库--链队(链式队列) 实现源代码如下: 1.liqueue.h /* copyright (t) 2016,烟台大学计算机学院 *All rights reserved. *文件工程名称:1 ...

  7. 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列

    自建算法库--顺序环形队列 本次实践将建立顺序环形队列的算法库,用于之后的工程中 实现源代码如下: 1.squeue.h /* copyright (t) 2017,烟台大学计算机学院 *All ri ...

  8. 数据结构上机实践第11周项目3 - 图遍历算法实现

    图遍历算法实现 本次实践将运用图结构基本算法库,进行遍历操作的实现,本次实践到的算法库点击此处参考.(编译环境:VC++6.0) 1.深度优先遍历--DFS 测试用图: 测试时用的图是,可以使用其他类 ...

  9. 数据结构上机实践第11周项目1 - 图基本算法库

    图基本算法库   本次实践将建立图的基本算法库,用以丰富算法库,灵活应对更多样的工程,所谓"技多不压身",算法亦如此.   本次实践将运用多文件组织工程的建立,点击此处参考.(编译 ...

  10. 第九周项目四----广义表算法库及应用1

    /*烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年12月11日 问题描述: 广义算法库 输入描述:无 输出描述:若干数据 */ 头文件 glist.h #ifndef GLIST_H_IN ...

最新文章

  1. ecshop 搜索热词推荐_多多搜索自定义关键词推广的基础点:如何选对致命的关键词...
  2. layui单元格鼠标样式_Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法...
  3. java.util.ConcurrentModificationException
  4. python怎么创建txt文件啊_python根据txt文本批量创建文件夹
  5. python 控件id_查看控件id的工具
  6. 企业架构:使用TOGAF进行产品开发
  7. python制作自动交易软件排名_A股股票自动化交易软件的使用和简易说明书,根据多年经验使用python开发...
  8. iOS签名校验那些事儿
  9. Web应用防火墙(WAF:Web Application Firewall)简介
  10. H5+echarts模拟全国程序员可视化大数据【附完整源码】
  11. Mybatis 学习笔记
  12. AppiumLibrary 时间控件的选择
  13. 差商matlab编程,Matlab数值计算差商与插值
  14. 轻量级过程改进之需求管理
  15. Vue错误03:Property or method “xxx“ is not defined on the instance but referenced during render.
  16. 【ZZULIOJ】 Python 1016: 银行利率
  17. 2023北京旅行计划 2023带父母北京旅行计划
  18. 《计算传播学导论》读书笔记:第七章 数据新闻
  19. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作 #华为云·寻找黑马程序员#
  20. OpenWrite(博客群发平台)到底好不好用,有什么缺点?

热门文章

  1. python入门部分基础知识(下)
  2. Oracle和MySQL新增只有查询权限用户
  3. 纳德拉:没有Excel的世界是无法想象的
  4. scratch实现弹跳小球2
  5. C++核心编程-5 文件操作
  6. 通俗解读SGD、Momentum、Nestero Momentum、AdaGrad、RMSProp、Adam优化算法
  7. 蓝牙电话之PBAP协议分析
  8. wps工资表怎么用计算机,wps制作工资表的方法步骤图
  9. Flutter 2.10 正式发布,包含 Windows 平台正式版,快来看看有什么新内容
  10. Win11删除英文输入法的方法教程