• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: 其他
  • 标签: Floyd算法  

资源简介

用Floyd算法实现求有向图中各顶点之间的最短路径及其长度

资源截图

代码片段和文件信息

/*
  Name: Floyd算法
  Copyright: 
  Author:冰人
  Date: 22-11-08 13:42
  Description:实现Floyd算法,并求出有向图中各顶点之间的最短路径及其长度 
*/

#include 
#include 

using namespace std;

//函数结果状态码
#define OK    1
#define ERROR 0

//常量定义 
#define INFINITY 65535 //最大值 
#define MAXSIZE     20 //最大顶点个数
#define MAX        100

//Status是函数的类型,其值是函数结果状态代码
typedef int Status;

//----- 有向无环图的邻接矩阵表示法 -----
typedef struct {
    char vexs [MAXSIZE];            //顶点向量 
    int weight [MAXSIZE][MAXSIZE];  //邻接矩阵:用权值表示 
    int vexnum arcnum;             //图当前的顶点数和弧数 
} Graph;

//----- 最短路径存储结构 -----
typedef struct Path {
    int element;    //在头结点表示最短路径的长度,其他结点中表示最短路径中对应顶点的下标 
    struct Path *next;  
} Path;    

//函数功能:找到顶点在顶点向量中的下标
//返回值:若找到则返回此顶点在顶点向量中的下标,若没找到则返回-1 
int LocateVex (Graph G char v)
{
    int i;
    
    for (i = 0; i < G.vexnum; i ++)
        if (G.vexs [i] == v)   
            return i;          //若找到此顶点,则返回顶点对应的下标 
    
    return -1;                 //若没找到此顶点,则返回-1
}

//函数功能: 计算输入序列的长度并判断有没有顶点重复 
int countVexs (char * vertices)
{
int i j;
//先判断有输入的顶点没有重复  
for (i = 0;i < MAX && vertices [i] != ‘\0‘;i ++)
    for (j = i + 1;j < MAX && vertices [j] != ‘\0‘;j ++)
        if (vertices [i] == vertices [j])
            return ERROR;     //若重复返回错误 

    for (i = 0;i < MAX && vertices [i] != ‘\0‘;i ++);   //计算输入序列的长度
return i;
}

//函数功能:用邻接矩阵表示法生成有向无环图 
Status CreateGraph (Graph &G)
{
    int i j k len;
    char v1 v2;
    char vertices [MAX];                 //储存输入的顶点 
    int occupy [MAXSIZE][MAXSIZE];       //标记邻接矩阵一条边是否已经存在
    
    do {
        cout << “请输入有向无环图的顶点数和弧数:“;
        cin  >> G.vexnum >> G.arcnum;
        if (G.vexnum <= 0 || G.vexnum > MAXSIZE || G.arcnum < 0 || G.arcnum > G.vexnum*(G.vexnum-1))
            cout << “输入不符合要求,请重新输入!!!“ << endl;
    } while (G.vexnum <= 0 || G.vexnum > MAXSIZE || G.arcnum < 0 || G.arcnum > G.vexnum*(G.vexnum-1));
    
    //构造顶点向量
    do {
        cout << “请输入所有的顶点:“;
        cin  >> vertices;                //顶点向量先用一维数组vertices储存 
        len = countVexs (vertices);      //计算输入的顶点向量的长度,并判断有没有输入的顶点重复 
        if (len != G.vexnum)             //若输入不符合要求,提示重新输入 
            cout << “输入不符合要求,请重新输入!!!“ << endl;
        else {                           //若输入符合要求,将这些顶点赋值给顶点向量 
            for (i = 0; i < G.vexnum; i ++) 
                G.vexs [i] = vertices [i];
        }
    } while (len != G.vexnum);    
    
    //初始化邻接矩阵 
    for (i = 0; i < G.vexnum; i ++) 
        for (j = 0; j < G.vexnum; j ++) {
            G.weight [i][j] = INFINITY;  //弧的权值都赋值为无穷大
            occupy [i][j] = 0;           //弧的标记值都赋值为0 
        }
    
    //输入每一条弧依附的起点、终点和权值 
    for (k = 0; k < G.arcnum; k ++) {
        do {
            cout << “请输入第“ << k + 1 << “条弧的起点和终点:“;
            cin  >> v1 >> v2;
            i = LocateVex (G v1);
            j = LocateVex (G v2);            
            if (i == -1 || j

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8563  2009-09-30 14:20  Floyd.cpp

----------- ---------  ---------- -----  ----

                 8563                    1


评论

共有 条评论

相关资源