floyd算法(C语言 邻接表)

来源:互联网 发布:python list get函数 编辑:程序博客网 时间:2024/05/21 01:51

综述

floyd算法用来求所有点之间的最短路径

对于ABCD四个顶点,用dis[n][n]表示任意两点距离

算法:

1、初始化两点距离,自己为0,无路径为1000

2、加入A点后,更新dis。

3、加入B,更新dis。因为上一步所有以A为一步中间点的dis已求完,所以这一步同时可求以B为中间点和以AB为中间点的dis

4、循环

三个循环里K就是加入的ABCD,i,j代表逐行逐列扫描,比较dis[I][k]+dis[k][j]与dis[i][j]的大小


数据结构

typedef struct Side//边{    int toVertex;//边指向的点    int data;    struct side *next;}Side,*sLink;typedef struct Vertex//顶点{    int data;    sLink first;//第一个边}Vertex,AdjList[20];typedef struct Graph//图{    AdjList adj;//顶点数组,注意不是指针,用.不用->    int n,v;//顶点数,边数}Graph,*gLink;

创建

void createGraph(gLink g){    int n,v,data;    printf("请输入顶点数与边数");    scanf("%d %d",&n,&v);    g->n = n;    g->v = v;    int i;    for(i=0;i<n;i++)    {        printf("请输入顶点%d权值",i);        scanf("%d",&data);        g->adj[i].data = data;        g->adj[i].first = NULL;    }    printf("请输入边信息");    int v1,v2,da;    for(i=0;i<v;i++)    {        scanf("%d %d %d",&v1,&v2,&da);        sLink s = (sLink)malloc(sizeof(Side));        s->toVertex = v2;        s->next = g->adj[v1].first;        g->adj[v1].first = s;        s->data = da;    }}

算法

int dis[15][15];void floyd(gLink g){    int i,j,k;    //初始化    for(i=0;i<g->n;i++)    {        for(j=0;j<g->n;j++)        {            dis[i][j]=1000;        }        dis[i][i]=0;    }    for(i=0;i<g->n;i++)    {        sLink s = g->adj[i].first;        while(s)        {            dis[i][s->toVertex]=s->data;            s=s->next;        }    }    //算法    for(k=0;k<g->n;k++)//把第K个点添加到中间点集合中    {        for(i=0;i<g->n;i++)//逐行        {            for(j=0;j<g->n;j++)//逐列            {                if(dis[i][k]+dis[k][j]<dis[i][j])//i-->k-->j                {                    dis[i][j] = dis[i][k]+dis[k][j];                }            }        }    }    //输出    for(i=0;i<g->n;i++)    {        for(j=0;j<g->n;j++)        {            printf("%-5d",dis[i][j]);        }        printf("\n");    }}

主函数

int main(){    gLink g = (gLink)malloc(sizeof(Graph));    createGraph(g);    floyd(g);    return 0;}


原创粉丝点击