最短路程问题 用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; /*邻接矩阵表示的图类型*/