【第13周 项目4 - Floyd算法的验证】

问题及代码

/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:项目4.cbp 作 者:张耀 完成日期:2015年11月30日 版 本 号:v1.0 问题描述:Floyd算法的验证 输入描述:无 程序输出:测试数据 */  

图算法库

代码

#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的前一个顶点k 
    printf("%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,  15,INF,INF},  
        {10,  0,INF,  6},  
        {INF, 8,  0,  2},  
        {3,  INF, 2,  0}  
    };  
    ArrayToMat(A[0], 4, g);  
    Floyd(g);  
    return 0;  
}

测试图

【第13周 项目4 - Floyd算法的验证】_第1张图片

运行结果

【第13周 项目4 - Floyd算法的验证】_第2张图片

知识点总结:

Floyd算法的验证。

你可能感兴趣的:(【第13周 项目4 - Floyd算法的验证】)