码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法

时间:2015-08-21 23:20:34      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:

//此代码综合网络上的代码。
//弗洛伊德算法Floyd代码
//杨鑫
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 				//最大顶点数
#define MAX_INT 10000 					//无穷大 

typedef int AdjType; 
typedef struct
{
    int pi[MAX_VERTEX_NUM];			//存放v到vi的一条最短路径
    int end;
}PathType;
 
typedef char VType; 				//设顶点为字符类型


//邻接矩阵表示的图
typedef struct
{
    VType V[MAX_VERTEX_NUM]; 		//顶点存储空间 
    AdjType A[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵 
}MGraph;

int path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//v到各顶点的最短路径向量
int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//v到各顶点最短路径长度向量 
    

//Floyd算法
//求网G(用邻接矩阵表示)中任意两点间最短路径 
//D[][]是最短路径长度矩阵,path[][]最短路径标志矩阵 
void Floyd(MGraph * G,int path[][MAX_VERTEX_NUM],int D[][MAX_VERTEX_NUM],int n)
{ 
    int i,j,k;
	//初始化
    for(i=0;i<n;i++)
	{ 
        for(j=0;j<n;j++)
		{
            if(G->A[i][j]<MAX_INT)
			{
                path[i][j]=j;
            }
			else
			{
                path[i][j]=-1;
            }
            D[i][j]=G->A[i][j];
        }
    } 
    
	//进行n次搜索
    for(k=0;k<n;k++)
	{ 
        for(i=0;i<n;i++)
		{
            for(j=0;j<n;j++)
			{
                if(D[i][j] > D[i][k] + D[k][j])
				{
                    D[i][j]=D[i][k]+D[k][j];			//取小者 
                    path[i][j]=path[i][k];				//改Vi的后继 
                }
            }
        }
    }
}


int main()
{
    int i,j,k,v=0,n=6;								//v为起点,n为顶点个数 
    MGraph G;
    
    //初始化 
    AdjType a[MAX_VERTEX_NUM][MAX_VERTEX_NUM]=
	{
        {0,12,18,MAX_INT,17,MAX_INT},
        {12,0,10,3,MAX_INT,5},
        {18,10,0,MAX_INT,21,11},
        {MAX_INT,3,MAX_INT,0,MAX_INT,8},
        {17,MAX_INT,21,MAX_INT,0,16},
        {MAX_INT,5,11,8,16,0} 
    };
    for(i=0;i<n;i++)
	{
        for(j=0;j<n;j++)
		{
            G.A[i][j]=a[i][j];
        }
    } 
    
    Floyd(&G,path,D,6);
	//输出每对顶点间最短路径长度及最短路径
    for(i=0;i<n;i++)
	{					
        for(j=0;j<n;j++)
		{
            printf("顶点%d到顶点%d的最短长度: ",i,j); 
            printf("%d\t",D[i][j]);						//输出Vi到Vj的最短路径长度
            k=path[i][j];								//取路径上Vi的后续Vk
            if(k==-1)
			{
                printf("顶点%d 和 顶点%d 之间没有路径\n",i,j);//路径不存在 
            }
			else
			{
                printf("最短路径为:"); 
                printf("(边%d",i);					//输出Vi的序号i
                //k不等于路径终点j时
				while(k!=j)
				{						 
                    printf(",V%d",k);				//输出k
                    k=path[k][j];					//求路径上下一顶点序号 
                }
                printf(",边%d)\n",j);			//输出路径终点序号 
            }
            printf("\n");
        } 
    }
    return 0;
}
 



结果:

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法

标签:

原文地址:http://blog.csdn.net/u012965373/article/details/47844725

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!