Floyd算法(记录路径)
2016-08-23 22:43
141 查看
/********************************************************** *@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算法(不记录路径)
- Floyd算法求最短路径并记录路径
- Swap HDU - 2819(二分匹配+记录路径)
- pku2253 记录从初始到终点最小的路径(某一部分),迪杰斯特拉求最短路
- 记录路径的搜索——zoj3332
- POJ 2457 Part Acquisition(记录路径单源最短路)
- HDU 1385【两点间最短路, DIJK + 记录路径】
- poj 1734 Sightseeing trip_ 最小环记录路径
- Floyd算法解决最短路径问题
- 最短路径—Dijkstra算法和Floyd算法
- 记录-springMVC访问web-inf下文件问题+在jsp页面导入jquery插件路径不对问题
- 最短路径之Dijkstra+Floyd算法
- 最短路径—Dijkstra算法和Floyd算法
- POJ3414 模拟倒水问题 BFS记录路径
- poj 1141 (区间dp记录路径问题)
- 最短路径—Dijkstra算法和Floyd算法
- HDU NO.1160 FatMouse's Speed(“最长上升子序列”,记录路径)
- 1、UVA624(记录路径问题)
- 使用Profile文件记录JFileChooser(或者File控件)最新打开的文件路径
- floyd算法求多源最短路径