Floyd算法(记录路径)

/**********************************************************
*@time 2016/08/23   22:13
*@place DHU.13.5005
*description floyd算法,算出所有点到所有点的距离并且记录路径
*************************************************************/
#include<cstdio>
#include<algorithm>
#define MAX_NUM 1<<15
/*********************************************************************
*@函数名           Floyd
*@paramter         int* ori_Paths        路径的集合
*@Parameter        int num_Of_Node       节点的个数
*@Parameter        int throug_Node       记录路径
*@返回值           int*                  Floyd算法结果
********************************************************************/
int* Floyd(int* ori_Paths,int* throug_Node,int num_Of_Node)
{
    int* new_Paths=(int*)malloc(num_Of_Node*num_Of_Node*sizeof(int));
    for(int i=0;i<num_Of_Node*num_Of_Node;i++) new_Paths[i]=ori_Paths[i];
    for(int k=0;k<num_Of_Node;k++)
    {
        for(int i=0;i<num_Of_Node;i++)
        {
            for(int j=0;j<num_Of_Node;j++)
            {
                if(new_Paths[i*num_Of_Node+j]>(new_Paths[i*num_Of_Node+k]+new_Paths[k*num_Of_Node+j]))//判断i到j经过k是否比直达更近
                {
                    new_Paths[i*num_Of_Node+j]=new_Paths[i*num_Of_Node+k]+new_Paths[k*num_Of_Node+j];
                    throug_Node[i*num_Of_Node+j]=throug_Node[i*num_Of_Node+k];
                }
            }
        }
    }
    return new_Paths;
}
/*********************************************************************
*@函数名           inti
*@Parameter        int num_Of_Node       节点的个数
*@Parameter        int *paths            存储路径的数组
*@Parameter        int *throug_Nodes     存储该路径途径的第一个点,比如throug_Nodes[i][j]=k,那么k几位路径i点到j点经过的第一个点
*@返回值          void
*@description     paths初始化,将所有路径的值置为正无穷,表示目前所有的点为孤点,
*                 将节点到自身的距离置为0;
*                 throug_Nodes将所有的路径i->j途径的第一个点设为j(也是从i出发后,唯一经过的点)
********************************************************************/
void inti(int*paths,int* throug_Nodes,int num_Of_Node)
{
    for(int i=0;i<num_Of_Node;i++)
    {
        for(int j=0;j<num_Of_Node;j++)
        {
            paths[i*num_Of_Node+j]=MAX_NUM;
            if(i==j) paths[i*num_Of_Node+j]=0;
            throug_Nodes[i*num_Of_Node+j]=j;
        }

    }
}
void print_Path(int start_Node,int end_Node,int num_Of_Node,int* throug_Nodes)
{
    printf("path is:");
    int tmp=start_Node;
    while(tmp!=end_Node)
    {
        if(tmp!=start_Node) printf("->");
        printf("%d",tmp);
        tmp=throug_Nodes[tmp*num_Of_Node+end_Node];
    }
    printf("->%d\n\n",end_Node);
}
int main()
{
    int num_Of_Node;
    int num_Of_Route;
    printf("Please Input number of nodes and routes:");
    scanf("%d %d",&num_Of_Node,&num_Of_Route);

    int* paths=(int*)malloc(num_Of_Node*num_Of_Node*sizeof(int));
    int* throug_Nodes=(int*)malloc(num_Of_Node*num_Of_Node*sizeof(int));
    inti(paths,throug_Nodes,num_Of_Node);


    printf("Please Input number all route:\n");
    for(int i=0;i<num_Of_Route;i++)
    {
        int start_Node,end_Node,length;
        scanf("%d %d %d",&start_Node,&end_Node,&length);
        paths[start_Node*num_Of_Node+end_Node]=length;
        paths[end_Node*num_Of_Node+start_Node]=length;
    }

    int* new_Paths=Floyd(paths,throug_Nodes,num_Of_Node);
    for(int i=0;i<num_Of_Node;i++)
    {
        for(int j=0;j<num_Of_Node;j++)
        {
            if(i!=j)
            {
                 printf("The shortest lengths :%d->%d=%d\n",i,j,new_Paths[i*num_Of_Node+j]);
                 print_Path(i,j,num_Of_Node,throug_Nodes);
            }

        }
    }
}
/*
6 9
0 1 3
0 3 4
0 5 5
1 2 1
1 5 5
2 3 5
3 1 3
4 3 3
4 5 2
*/
/*
5 7
0 1 5
0 4 7
1 2 4
4 2 8
1 3 2
2 3 6
4 3 1
*/

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值