/**********************************************************
*@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
*/
Floyd算法(記錄路徑)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.