路程c语言,最短路程问题 用C语言编写 会者请进 如答案可用,另有积分100相赠...

该博客介绍了如何使用C语言实现Floyd算法来解决有向图中所有顶点对之间的最短路径问题。程序包括邻接矩阵的创建、Floyd算法的实现以及结果的输出。用户需输入图的顶点数、边数以及边的权重信息,程序将计算并显示最短路径和距离。
摘要由CSDN通过智能技术生成

最短路程问题 用C语言编写 会者请进 如答案可用,另有积分100相赠

來源:互聯網  2009-06-18 03:35:57  評論

分類: 電腦/網絡 >> 程序設計 >> 其他編程語言

問題描述:

注:下图中123456表示城市,有的路只能单行,例如1可到2,但2到不了1。数字为交通费用,无表示无法直接到达或无法到达。问如何才能最节省交通费用?

1 2 3 4 5 6

1 无 50 无 10 无 无 ( 1-〉2:50 , 1-〉4:10,

2 无 无 10 15 50 无 2-〉3:10 )

3 无 无 无 无 35 无

4 20 无 无 无 无 无

5 无 20 30 15 无 无

6 无 无 无 无 3 无

大哥们谢谢帮帮忙,小弟我感激不尽。积分不是问题,如果看不懂请提问。

參考答案:

对于可以双行的线路要输入两次:如2和四应该如下输入

2 4 15

4 2 15

/*************************************************/

/* 所有顶点对最短路径算法 */

/* 文件名floyd.c 函数名floyd1() */

/*************************************************/

#include "c_ljjz.c" /*引入邻接矩阵创建程序*/

typedef int dist[m][m]; /* 距离向量类型*/

typedef int path[m][m]; /* 路径类型*/

/*------------Floyd所有顶点对间的最短路径算法-----------*/

void floyd1(mgraph g,path p,dist d)

{ int i,j,k;

/*初始化*/

for (i=0;i

for (j=0;j

{ d[i][j]=g.edges[i][j];

if (i!=j && d[i][j]

}

for (k=0;k

{ for (i=0;i

for (j=0;j

if (d[i][j]>(d[i][k]+d[k][j]))

{ d[i][j]=d[i][k]+d[k][j];

p[i][j]=k;

}

}

}

void output_pd(mgraph g,path p,dist d)

{ /*输出有向图的最短路径*/

int i,j;

printf("\nShort distance:\n");

for (i=0;i

{ for (j=0;j

printf("%7d",d[i][j]);

printf("\n");

}

printf("\nPath:\n");

for (i=0;i

{ for (j=0;j

printf("%7d",p[i][j]);

printf("\n");

}

}

/*---------- 主程序 ------------*/

void main()

{ mgraph g; /* 有向图 */

path p; /* 路径向量 */

dist d; /* 最短路径向量 */

creatmgraph1(&g); /* 创建有向网的邻接矩阵*/

print(g); /* 输出图的邻接矩阵*/

floyd1(g,p,d); /* 求所有顶点对之间的最短路径*/

output_pd(g,p,d); /*输出所有顶点对间的最拓距离及路径信息*/

}

/******************************************************/

/* 图的邻接矩阵创建算法 */

/* 文件名c_ljjz.c 函数名creatmgraph1() */

/* 函数名creatmgraph2() */

/******************************************************/

#include

#include "mgraph.h"

void creatmgraph1(mgraph *g)

{int i,j,k,w; /*建立有向网络的邻接矩阵存储结构*/

printf("please input n and e:\n");

scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/

getchar();

printf("please input vexs:\n");

for(i=0;in;i++) /*输入图中的顶点值*/

g->vexs[i]=getchar();

for(i=0;in;i++) /*初始化邻接矩阵*/

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

if (i==j) g->edges[i][j]=0;

else g->edges[i][j]=FINITY;

printf("please input edges:\n");

for (k=0;ke;k++) /*输入网络中的边*/

{scanf("%d %d %d", &i,&j,&w);

g->edges[i][j]=w;

/*若是建立无向网,只需在此加入语句g->edges[j][i]=w;即可*/

}

}

void creatmgraph2(mgraph *g)

{int i,j,k,w; /*建立无向网络的邻接矩阵存储结构*/

printf("please input n and e:\n");

scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/

getchar();

printf("please input vexs:\n");

for(i=0;in;i++) /*输入图中的顶点值*/

g->vexs[i]=getchar();

for(i=0;in;i++) /*初始化邻接矩阵*/

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

if (i==j) g->edges[i][j]=0;

else g->edges[i][j]=FINITY;

printf("please input edges:\n");

for (k=0;ke;k++) /*输入网络中的边*/

{scanf("%d%d%d", &i,&j,&w);

g->edges[i][j]=w;

g->edges[j][i]=w;

}

}

void print(mgraph g)

{/*辅助函数,输出邻接矩阵表示的图g*/

int i,j;

for (i=0;i

printf("%c ",g.vexs[i]);

printf("\n");

for (i=0;i

{ for (j=0;j

printf("%6d",g.edges[i][j]);

printf("\n");

}

}

/********************************************/

/* 邻接矩阵类型定义的头文件 */

/* 文件名:mgraph.h */

/********************************************/

#define FINITY 5000 /*此处用5000代表无穷大*/

#define m 20 /*最大顶点数*/

typedef char vertextype; /*顶点值类型*/

typedef int edgetype; /*权值类型*/

typedef struct{

vertextype vexs[m]; /*顶点信息域*/

edgetype edges[m][m]; /*邻接矩阵*/

int n,e; /*图中顶点总数与边数*/

} mgraph; /*邻接矩阵表示的图类型*/

[b]分类:[/b] 电脑/网络 >> 程序设计 >> 其他编程语言[br][b]问题描述:[/b][br]注:下图中123456表示城市,有的路只能单行,例如1可到2,但2到不了1。数字为交通费用,无表示无法直接到达或无法到达。问如何才能最节省交通费用?

1 2 3 4 5 6

1 无 50 无 10 无 无 ( 1-〉2:50 , 1-〉4:10,

2 无 无 10 15 50 无 2-〉3:10 )

3 无 无 无 无 35 无

4 20 无 无 无 无 无

5 无 20 30 15 无 无

6 无 无 无 无 3 无

大哥们谢谢帮帮忙,小弟我感激不尽。积分不是问题,如果看不懂请提问。[br][b]参考答案:[/b][br]对于可以双行的线路要输入两次:如2和四应该如下输入

2 4 15

4 2 15

/*************************************************/

/* 所有顶点对最短路径算法 */

/* 文件名floyd.c 函数名floyd1() */

/*************************************************/

#include "c_ljjz.c" /*引入邻接矩阵创建程序*/

typedef int dist[m][m]; /* 距离向量类型*/

typedef int path[m][m]; /* 路径类型*/

/*------------Floyd所有顶点对间的最短路径算法-----------*/

void floyd1(mgraph g,path p,dist d)

{ int i,j,k;

/*初始化*/

for (i=0;i

for (j=0;j

{ d[i][j]=g.edges[i][j];

if (i!=j && d[i][j]

}

for (k=0;k

{ for (i=0;i

for (j=0;j

if (d[i][j]>(d[i][k]+d[k][j]))

{ d[i][j]=d[i][k]+d[k][j];

p[i][j]=k;

}

}

}

void output_pd(mgraph g,path p,dist d)

{ /*输出有向图的最短路径*/

int i,j;

printf("\nShort distance:\n");

for (i=0;i

{ for (j=0;j

printf("%7d",d[i][j]);

printf("\n");

}

printf("\nPath:\n");

for (i=0;i

{ for (j=0;j

printf("%7d",p[i][j]);

printf("\n");

}

}

/*---------- 主程序 ------------*/

void main()

{ mgraph g; /* 有向图 */

path p; /* 路径向量 */

dist d; /* 最短路径向量 */

creatmgraph1(&g); /* 创建有向网的邻接矩阵*/

print(g); /* 输出图的邻接矩阵*/

floyd1(g,p,d); /* 求所有顶点对之间的最短路径*/

output_pd(g,p,d); /*输出所有顶点对间的最拓距离及路径信息*/

}

/******************************************************/

/* 图的邻接矩阵创建算法 */

/* 文件名c_ljjz.c 函数名creatmgraph1() */

/* 函数名creatmgraph2() */

/******************************************************/

#include

#include "mgraph.h"

void creatmgraph1(mgraph *g)

{int i,j,k,w; /*建立有向网络的邻接矩阵存储结构*/

printf("please input n and e:\n");

scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/

getchar();

printf("please input vexs:\n");

for(i=0;in;i++) /*输入图中的顶点值*/

g->vexs[i]=getchar();

for(i=0;in;i++) /*初始化邻接矩阵*/

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

if (i==j) g->edges[i][j]=0;

else g->edges[i][j]=FINITY;

printf("please input edges:\n");

for (k=0;ke;k++) /*输入网络中的边*/

{scanf("%d %d %d", &i,&j,&w);

g->edges[i][j]=w;

/*若是建立无向网,只需在此加入语句g->edges[j][i]=w;即可*/

}

}

void creatmgraph2(mgraph *g)

{int i,j,k,w; /*建立无向网络的邻接矩阵存储结构*/

printf("please input n and e:\n");

scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/

getchar();

printf("please input vexs:\n");

for(i=0;in;i++) /*输入图中的顶点值*/

g->vexs[i]=getchar();

for(i=0;in;i++) /*初始化邻接矩阵*/

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

if (i==j) g->edges[i][j]=0;

else g->edges[i][j]=FINITY;

printf("please input edges:\n");

for (k=0;ke;k++) /*输入网络中的边*/

{scanf("%d%d%d", &i,&j,&w);

g->edges[i][j]=w;

g->edges[j][i]=w;

}

}

void print(mgraph g)

{/*辅助函数,输出邻接矩阵表示的图g*/

int i,j;

for (i=0;i

printf("%c ",g.vexs[i]);

printf("\n");

for (i=0;i

{ for (j=0;j

printf("%6d",g.edges[i][j]);

printf("\n");

}

}

/********************************************/

/* 邻接矩阵类型定义的头文件 */

/* 文件名:mgraph.h */

/********************************************/

#define FINITY 5000 /*此处用5000代表无穷大*/

#define m 20 /*最大顶点数*/

typedef char vertextype; /*顶点值类型*/

typedef int edgetype; /*权值类型*/

typedef struct{

vertextype vexs[m]; /*顶点信息域*/

edgetype edges[m][m]; /*邻接矩阵*/

int n,e; /*图中顶点总数与边数*/

} mgraph; /*邻接矩阵表示的图类型*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值