数据结构--Floyd

//这个算法比较好理解。

#include <stdio.h>
#define MAXVEX 10
#define INFINITY 655535
typedef struct
{
int arc[MAXVEX][MAXVEX];
char vervexs[MAXVEX];
int vexnum,arcnum;
}GraphType;
int Located(GraphType*G,char v0);
void create(GraphType*G);
void Floyd(GraphType*G);
int main(void)
{
int i,j;
GraphType G;
create(&G);
printf("邻接矩阵为:\n");
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
printf("%9d",G.arc[i][j]);
}
printf("\n");
}
Floyd(&G);
return 0;
}
int Located(GraphType*G,char v0)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
{
if(G->vervexs[i]==v0)
{
k=i;
break;
}
}
return k;
}
void create(GraphType*G)
{
char a,b;
int i,j,m,n,weight;
printf("请输入图的点点数和边数:");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("请输入点点的信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vervexs[i]));
for(i=0;i<G->vexnum;i++)//初始化
for(j=0;j<G->vexnum;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=INFINITY;
}
printf("对应的点点及其他们直接的信息:");
for(i=0;i<G->arcnum;i++)
{
scanf("\n%c,%c,%d",&a,&b,&weight);
m=Located(G,a);
n=Located(G,b);
G->arc[m][n]=weight;//为无向图
G->arc[n][m]=weight;
}
return;
}
void Floyd(GraphType*G)
{
int P[MAXVEX][MAXVEX],D[MAXVEX][MAXVEX];
int v,w,k,m,n;
char a,b;
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
{
D[v][w]=G->arc[v][w];//D[v][w]值即为对应点间的权值
P[v][w]=w;//初始化P
}
for(k=0;k<G->vexnum;k++)//转接点
for(v=0;v<G->vexnum;v++)
for(w=0;w<G->vexnum;w++)
if(D[v][w]>D[v][k]+D[k][w])
{
D[v][w]=D[v][k]+D[k][w];
P[v][w]=P[v][k];//路径设置为经过下标为K的顶点
}
for(v=0;v<G->vexnum;v++)
{
for(w=v+1;w<G->vexnum;w++)
{
printf("%c--%c weight:%d\n",G->vervexs[v],G->vervexs[w],D[v][w]);
k=P[v][w];//获得第一个路径点点下标
printf("path: %c",G->vervexs[v]);//打印原点
while(k!=w)//如果路径顶点下标不是终点
{
printf("->%c",G->vervexs[k]);
k=P[k][w];
}
printf("-> %c\n",G->vervexs[w]);//打印出终点
}
}
printf("请输入要查找两点之间的最短距离:");
scanf("\n%c,%c",&a,&b);
m=Located(G,a);
n=Located(G,b);
k=P[m][n];//获得第一个路径点点下标
printf("path: %c",G->vervexs[m]);//打印原点
while(k!=n)
{
printf("->%c",G->vervexs[k]);
k=P[k][n];
}
printf("-> %c weight %d\n",G->vervexs[n],D[m][n]);//打印出终点
return ;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值