Floyd算法(不記錄路徑)

/**********************************************************
*@time 2016/08/23   20:06
*@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       節點的個數
*@返回值           int*                  Floyd算法結果
********************************************************************/
int* Floyd(int* ori_Paths,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];
                }
            }
        }
    }
    return new_Paths;
}
/*********************************************************************
*@函數名           inti
*@Parameter        int num_Of_Node       節點的個數
*@返回值          int*                  初始化後的結果
*@description     初始化路徑,將所有路徑的值置爲正無窮,表示目前所有的點爲孤點,
*                 將節點到自身的距離置爲0
********************************************************************/
int *inti(int num_Of_Node)
{
    int* paths=(int*)malloc(num_Of_Node*num_Of_Node*sizeof(int));
    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;
        }

    }
    return paths;
}
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=inti(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,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("%d->%d=%d\n",i,j,new_Paths[i*num_Of_Node+j]);
        }
    }
}
/*
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
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章