dis 算法 c语言,floyd算法(C语言 邻接表)

综述

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;iadj[i].data = data;

g->adj[i].first = NULL;

}

printf("请输入边信息");

int v1,v2,da;

for(i=0;itoVertex = 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;in;i++)

{

for(j=0;jn;j++)

{

dis[i][j]=1000;

}

dis[i][i]=0;

}

for(i=0;in;i++)

{

sLink s = g->adj[i].first;

while(s)

{

dis[i][s->toVertex]=s->data;

s=s->next;

}

}

//算法

for(k=0;kn;k++)//把第K个点添加到中间点集合中

{

for(i=0;in;i++)//逐行

{

for(j=0;jn;j++)//逐列

{

if(dis[i][k]+dis[k][j]k-->j

{

dis[i][j] = dis[i][k]+dis[k][j];

}

}

}

}

//输出

for(i=0;in;i++)

{

for(j=0;jn;j++)

{

printf("%-5d",dis[i][j]);

}

printf("\n");

}

}

主函数

int main()

{

gLink g = (gLink)malloc(sizeof(Graph));

createGraph(g);

floyd(g);

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值