弗洛伊德法求最短路径
来源:互联网 发布:清华大学材料学院知乎 编辑:程序博客网 时间:2024/05/16 06:50
#include<stdio.h>#include<stdlib.h>#include <malloc.h>#include <string.h>#define MAX 20#define INF 50 // 此处修改最大值,因为数值过大或过小,会造成溢出,上溢或下溢,所以取了个小的值。#define nLENGTH(a) (sizeof(a)/sizeof(a[0]))#define eLENGTH(a) ( sizeof(a) / sizeof(char) )/ ( sizeof(a[0]) / sizeof(char) )typedef struct _graph{ char vexs[MAX]; // 顶点集合 int vexnum; // 顶点数 int edgnum; // 边数 int matrix[MAX][MAX]; // 邻接矩阵}Graph, *PGraph;// 边的结构体 typedef struct _EdgeData{ char start; // 边的起点 char end; // 边的终点 int weight; // 边的权重}EData;//指向节点的位置int point_node(PGraph g,char c){for(int i=0;i<g->vexnum;i++){if(g->vexs[i]==c){return i;}}return -1;}PGraph create_graph(int b[][3],char a[],int n,int e){char c1,c2; //边的2个顶点PGraph g; //矩阵g=(PGraph)malloc(sizeof(Graph));//memset()第一个参数 是地址,第二个参数是开辟空间的初始值,第三个参数是开辟空间的大小memset(g, INF, sizeof(Graph));printf("顶点个数:\n");//顶点数g->vexnum=n;printf("%d\n",g->vexnum);printf("边个数:\n");//边数g->edgnum=e;printf("%d\n",g->edgnum);//初始化顶点for(int j=0;j<g->vexnum;j++){g->vexs[j]=a[j];}for(int i=0;i<g->edgnum;i++){int p1,p2;c1=char(b[i][0]);c2=char(b[i][1]);p1=point_node(g, c1);p2=point_node(g, c2);if (p1==-1 || p2==-1) { printf("input error: invalid edge!\n"); free(g); continue; }g->matrix[p1][p2]=b[i][2];g->matrix[p2][p1]=b[i][2];}for( i=0;i<g->edgnum;i++){g->matrix[i][i]=0;}return g;}//弗洛伊德法求最短路径void Floyd_road(PGraph g){int i,j;int dist[MAX][MAX];for(i=0;i<g->vexnum;i++){for(j=0;j<g->vexnum;j++){dist[i][j]=g->matrix[i][j];}}for(int k=0;k<g->vexnum;k++){for( i=0;i<g->vexnum;i++){for(j=0;j<g->vexnum;j++){if(dist[i][j]>dist[i][k]+dist[k][j]){dist[i][j]=dist[i][k]+dist[k][j];}}}}//打印最短路径数组for( i=0;i<g->vexnum;i++){for(j=0;j<g->vexnum;j++){ printf("%d ",dist[i][j]);}printf("\n");}}//测试int main(){int i,j;PGraph gp;//测试用例char a[]={'A', 'B', 'C', 'D', 'E', 'F', 'G'};int b[][3]={ {'A', 'B',12}, {'A', 'F',16}, {'A', 'G',14}, {'B', 'F',7}, {'B', 'C',10}, {'C', 'F',6}, {'C', 'E',5},{'C', 'D',3},{'D', 'E',4},{'E', 'F',2},{'E', 'G',8},{'F', 'G',9}}; //测试用例int n=nLENGTH(a);int e=eLENGTH(b);gp=create_graph(b,a,n,e);//打印矩阵for (i = 0; i < gp->vexnum; i++) { for (j = 0; j < gp->vexnum; j++) printf("%d ", gp->matrix[i][j]); printf("\n"); }printf("\n");Floyd_road(gp);return 0;}
0 0
- 弗洛伊德法求最短路径
- 弗洛伊德算法求最短路径
- 弗洛伊德算法求最短路径
- 弗洛伊德算法求最短路径
- 弗洛伊德算法 路径还原
- 弗洛伊德最短路径算法
- 弗洛伊德算法--最短路径
- 最短路径-弗洛伊德算法
- 弗洛伊德最短路径算法
- 【原创】求最短路径-弗洛伊德算法
- 最短路径(弗洛伊德算法)
- 最短路径--弗洛伊德算法
- 最短路径:弗洛伊德算法
- 弗洛伊德最短路径算法
- 弗洛伊德最短路径算法
- 最短路径---弗洛伊德算法
- 最短路径(弗洛伊德算法)
- 弗洛伊德
- 51nod 1105 第K大的数【二分+思维】好题~
- 求3×3矩阵对角线元素之和---2种方法
- Mysql5.7.16安装教程
- 服务器 进程实现
- POJ 2393 Yogurt factory 笔记
- 弗洛伊德法求最短路径
- <C++>_函数重载
- Android开发艺术探索笔记(15)- 自定义View
- 表单提交数据乱码(datatables提交中文查询处理)
- 面向对象(猜字游戏)
- android中常用的距离单位
- input输入框下拉提示、js的keyup的实现、
- 公司发版shell脚本重构
- 如何重新修改sourceinght的注册序列号