warshall算法 c语言,C语言实现Floyd算法

#include

#include

#include

#define NUM 4

typedef struct MGraph /* 邻接表存储结构 */

{

int edges[NUM][NUM];

int n,e;

} MGraph;

MGraph *build_mgraph();

void Floyd(MGraph *mgraph);

void Ppath(int path[][NUM], int i, int j);

void Dispath(int A[][NUM], int path[][NUM], int n);

int main(void)

{

MGraph *mgraph;

printf("\n*************************************************************\n");

printf("该图的矩阵表示为:\n");

mgraph=build_mgraph();

printf("\n*************************************************************\n");

printf("各顶点间最短路径为:\n");

Floyd(mgraph);

printf("\n*************************************************************\n");

return 0;

}

MGraph *build_mgraph()

{

int i,j;

int num_e=0;

MGraph *mgraph=(MGraph *)malloc(sizeof(MGraph));

int matrix[NUM][NUM]={{0,5,INT_MAX,7},

{INT_MAX,0,4,2},

{3,3,0,2},

{INT_MAX,INT_MAX,1,0}};

for(i=0;i

{

for(j=0;j

{

mgraph->edges[i][j]=matrix[i][j];

if(matrix[i][j]!=0 && matrix[i][j]!=INT_MAX)

num_e++;

}

}

mgraph->n=NUM;

mgraph->e=num_e;

printf("node=%d;edges=%d\n",mgraph->n,mgraph->e);

for(i=0;i

{

for(j=0;j

{

if(mgraph->edges[i][j]!=INT_MAX)

printf("%3d",mgraph->edges[i][j]);

else

printf("%3c",'&');

}

printf("\n");

}

return mgraph;

}

void Floyd(MGraph *mgraph)

{

int A[NUM][NUM],path[NUM][NUM];

int i,j,k;

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

{

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

{

A[i][j]=mgraph->edges[i][j];

path[i][j]=-1;

}

}

for(k=0;kn;k++)

{

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

{

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

{

if(A[i][k]!=INT_MAX && A[k][j]!=INT_MAX && 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,mgraph->n);

}

void Ppath(int path[][NUM], int i, int j)

{

int k;

k=path[i][j];

if(k==-1)

return;

Ppath(path,i,k);

printf("%d,",k);

Ppath(path,k,j);

}

void Dispath(int A[][NUM], int path[][NUM], int n)

{

int i,j;

for(i=0;i

{

for(j=0;j

{

if(A[i][j]==INT_MAX)

printf("%d-%d have no path",i,j);

printf("%d-%d-%d: ",i,j,A[i][j]);

printf("%d,",i);

Ppath(path,i,j);

printf("%d\n",j);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值