Floyd算法学习(最短路径)

来源:互联网 发布:php网站数据库在哪里 编辑:程序博客网 时间:2024/05/16 00:39
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100#define MAXCOST 99typedef struct{    int vertex[MAXSIZE];    int edges[MAXSIZE][MAXSIZE];} MyGraph;void GrarhPrint(MyGraph*g,int n);void CreateMGraph(MyGraph*g,int e,int n);void Floyd(MyGraph*g,int n);void Ppath(int path[][MAXSIZE],int i,int j);void Dispath(int A[][MAXSIZE],int path[][MAXSIZE],int n);int main(){    MyGraph *g=(MyGraph*)malloc(sizeof(MyGraph));    CreateMGraph(g,10,6);    Floyd(g,6);    return 0;}void CreateMGraph(MyGraph*g,                  int e,//边数                  int n //顶点数                 ){    int i,j,k,m;    printf("Input data of vertex(0~n-1):\n");    for(i=0; i<n; i++)    {        g->vertex[i]=i; //把顶点0~n-1保存的数组中    }    //对顶点初始化,该开始都是没有通路    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)        {            if(i==j)                g->edges[i][j]=0;            else                g->edges[i][j]=MAXCOST;//99为不通        }    }    //输入通路,并确定边的权值    for(k=0; k<e; k++)    {        printf("Input edge of(i,j) and edge of size:");        scanf("%d%d%d",&i,&j,&m);        g->edges[i][j]=m;    }    GrarhPrint(g,n);}//输出图void GrarhPrint(MyGraph*g,int n){    int i=0;    int j=0;    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)            if(g->edges[i][j]==MAXCOST||i==j)                printf("∞\t");            else                printf("%d\t",g->edges[i][j]);//这里输入的是哪两个点之间有路径        printf("\n");    }}void Floyd(MyGraph*g,int n){    int A[MAXSIZE][MAXSIZE],path[MAXSIZE][MAXSIZE];    int i,j,k;    for(j=0;j<n;j++)//初始化    {        for(i=0;i<n;++i)        {            A[i][j]=g->edges[i][j];            path[i][j]=-1;        }    }    for(k=0;k<n;k++)    {        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                if(A[i][j]>A[i][k]+A[k][j])                {                    A[i][j]=A[i][k]+A[k][j];                    path[i][j]=k;                }            }        }    }    Dispath(A,path,n);}void Ppath(int path[][MAXSIZE],int i,int j){    int k;    k=path[i][j];    if(k!=-1)//顶点Vk不是起点    {        Ppath(path,i,k);//找顶点Vi的前一个顶点Vk        printf("%d,",k);//输出顶点Vk的序号k        Ppath(path,k,j);//找顶点Vk的前一个顶点 Vj    }}void Dispath(int A[][MAXSIZE],int path[][MAXSIZE],int n){               //输出最短路径    int i,j;    for(i=0;i<n;i++)    {        for(j=0;j<n;j++)        {            if(A[i][j]==MAXCOST)//MAXCOST表示没有通路            {                if(i!=j)                    printf("从%d到%d没有路径!\n",i,j);            }            else            {                printf("从%d到%d的路径长度:%d,路径:",i,j,A[i][j]);                printf("%d,",i);//输出路径上的起点序号i                Ppath(path,i,j);//输出路径上的各中间点序号                printf("%d\n",j);//输出路径上的终点序号            }        }    }}
原创粉丝点击