弗洛伊德法求最短路径

来源:互联网 发布:清华大学材料学院知乎 编辑:程序博客网 时间: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
原创粉丝点击