#include

#include

#include

typedef struct ArcCell

{

int adj;                //相邻接

}ArcCell;

typedef struct VertexType

{

int id;                //城市序号

char city[20];                //城市名称

}VertexType;

typedef struct

{

VertexType  vex[25];                //图中的顶点,即为城市

ArcCell        arcs[25][25];        //图中的边,即为城市间的距离

int         vexnum, arcnum;        //顶点数,边数

}MGragh;                            //定义图的类型

MGragh G;            //把图定义为全局变量

int P[25][25];        //声明顶点(站点)

long int D[25];        //距离

void initCityName(char *filename)

{

int id;

char city[20];

FILE *fp;

fp=fopen(filename,"r");

if(!fp)

{

printf("文件不存在!\n");

exit(1);

}

fscanf(fp,"%d%s",&id,city);

while(!feof(fp))

{

// printf("%-8d%-8s\n",id,city);

G.vex[id].id=id;

strcpy(G.vex[id].city,city);

fscanf(fp,"%d%s",&id,city);

}

fclose(fp);

}

void initCityDistance(char *filename){

int i ,j;

//这里把所有的边假定为20000,含义是城市间不可到到达距离

for(i = 0; i < G.vexnum; ++i)

for(j = 0; j < G.vexnum; ++j)

G.arcs[i][j].adj = 20000;

//下边是可直接到达的城市间距离,由于两个城市间的距离是互相的,所以要对图中对称的边同时赋值

int startCityId,endCityId,distance;

FILE *fp;

fp=fopen(filename,"r");

if(!fp)

{

printf("文件不存在!\n");

exit(1);

}

fscanf(fp,"%d%d%d",&startCityId,&endCityId,&distance);

while(!feof(fp))

{

//printf("%-8d%-8d%-8d\n",startCityId,endCityId,distance);

G.arcs[startCityId][endCityId].adj = G.arcs[endCityId][startCityId].adj = distance;

fscanf(fp,"%d%d%d",&startCityId,&endCityId,&distance);

}

fclose(fp);

}

void GreateUDN(int v, int a)        //造图函数

{

G.vexnum = v;

G.arcnum = a;

// 加载城市名称

initCityName("city.txt");

// 加载城市间距离

initCityDistance("cityDistance.txt");

}

void narrate()

{

int i, k;

printf("\n***********欢迎使用最优交通图最短路径算法(模拟中国铁路交通图)***********\n");

printf("\n\t\t中华人民共和国部分城市交通枢纽中心\n\n");

for(i = 0; i < 25; ++i)

{

printf( "(%2d)%-12s", i, G.vex[i].city );        //输出城市列表

k = k + 1;                                    //k++

if( k % 4 == 0 )

printf("\n");

}

}

void ShortestPath(int num)

{

int v, w, i, t;

int final[25];

int min;

for( v = 0; v < 25; ++v )

{

final[v] = 0;

D[v] = G.arcs[num][v].adj;

for(w = 0; w < 25; ++w)

{

P[v][w] = 0;

}

if(D[v] < 20000)

{

P[v][num] = 1;

P[v][v] = 1;

}

}

D[num] = 0;

final[num] = 1;

for( i = 0; i < 25; ++i )

{

min = 20000;

for( w = 0; w < 25; ++w )

if( !final[w] )

if( D[w] < min )

{

v=w;

min=D[w];

}

final[v] = 1;

for( w = 0; w < 25; ++w)

if( !final[w] && ( ( min+G.arcs[v][w].adj ) < D[w] ) )

{

D[w] = min + G.arcs[v][w].adj;

for( t = 0; t < 25; ++t)

P[w][t] = P[v][t];

P[w][w] = 1;

}

}

}

void output( int city1, int city2 )

{

int a, b, c, d, q = 0;

a = city2;

if( a != city1 )

{

printf( "\n【%s】到【%s】的最短路径是:",G.vex[city1].city, G.vex[city2].city );

printf("【最短距离为%dKm】\n\t", D[a]);

printf("%s", G.vex[city1].city);

d = city1;

for(c = 0; c < 25; ++c)

{

gate:

P[a][city1] = 0;

for( b = 0; b < 25; b++)

{

if(G.arcs[d][b].adj < 20000 && P[a][b])

{

printf("-->%s",G.vex[b].city);

q = q + 1;

P[a][b] = 0;

d = b;

if(a%8 == 8)

printf("\n");

goto gate;

}

}

}

}

}

int main()

{

while(1)

{

int v0, v1;

GreateUDN(25,30);

narrate();

printf("\n\n请选择起点城市(0-24):\n");

scanf("%d", &v0);

printf("请选择终点城市(0-24):\n");

scanf("%d", &v1);

ShortestPath(v0);                //计算两个城市之间的最短路径

output(v0, v1);                    //输出结果

printf("\n\n");

}

return 0;

}

文件:city.txt

内容:

0 乌鲁木齐

1 悉尼

2 兰州

3 呼和浩特

4 北京

5 天津

6 沈阳

7 长春

8 哈尔滨

9 大连

10 西安

11 郑州

12 徐州

13 成都

14 武汉

15 上海

16 昆明

17 贵阳

18 株洲

19 南昌

20 福州

21 柳州

22 南宁

23 广州

24 深圳

文件:cityDistance.txt

内容:

0 2 1892

1 2 216

2 3 1145

2 10 676

3 4 668

4 5 137

5 6 704

6 7 305

7 8 242

6 9 397

4 11 695

5 12 674

10 13 842

11 14 534

12 15 651

13 16 1100

13 17 967

14 18 409

17 18 902

15 19 825

18 19 367

19 20 622

17 21 607

18 21 672

21 22 255

18 23 675

23 24 140

16 17 639

10 11 511

11 12 349

请用c语言编程求图的最短路径,最短路径-交通图-c语言实现相关推荐

  1. c语言编程所得票数,C语言编程求1X2X3····Xn所得的数末尾有多少个零

    C语言编程求1X2X3····Xn所得的数末尾有多少个零 发布时间:2020-08-10 02:23:57 来源:51CTO 阅读:312 作者:sonissa 参见大数的阶乘 https://blo ...

  2. python输入一个英文句子、统计单词个数_C语言编程求一个英文句子中的单词数和最长单词的位置、长度及输出这个单词。c++编程 从键盘输入一个英文...

    C语言编程求一个英文句子中的单词数和最长单词的位置.长度及输出这个单词. c++编程 从键盘输入一个英文 www.zhiqu.org     时间: 2020-11-23 我刚做了一关于英文句子里面每 ...

  3. 用c语言分别输出1 2 3,用C语言编程求出1!+2!+3!+……+20!的值

    用C语言编程求出1!+2!+3!+--+20!的值 关注:189  答案:5  手机版 解决时间 2021-02-23 18:44 提问者妳熄滅叻菸,説啓従偂 2021-02-23 12:26 求一到 ...

  4. c语言编程求二元一次方程组方程,二元一次方程组练习题 已知二元一次方程的三个系数,用C语言编程求方程的......

    导航:网站首页 > 二元一次方程组练习题 已知二元一次方程的三个系数,用C语言编程求方程的... 二元一次方程组练习题 已知二元一次方程的三个系数,用C语言编程求方程的... 相关问题: 匿名网 ...

  5. c语言程序设计阶乘输出,C语言编写10的阶乘,用C语言编程求10的阶乘

    导航:网站首页 > C语言编写10的阶乘,用C语言编程求10的阶乘 C语言编写10的阶乘,用C语言编程求10的阶乘 匿名网友: 思路:先定义一个函数求一个数的阶乘,接着依次从1到10调用该函数就 ...

  6. 四色着色问题 c语言编程,数据结构-图着色问题

    7-38 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要 ...

  7. c语言编程求macd最大值,2010年天津工业大学耀华杯计算机竞赛试卷(C语言全卷带答案).doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp习题/试题 2010年天津工业大学耀华杯计算机竞赛试卷(C语言 ...

  8. 1000以内所有同构数java算法_C语言编程求出1~1000的同构数

    2015-10-06 C语言问题.要求编程求出总成绩并按总成绩排? #include int main() { int i,j,k; int tempX,tempY; int res[6][2]={0 ...

  9. c语言编程过程应注意什么意思,单片机C语言编程应注意的若干问题

    <单片机C语言编程应注意的若干问题>由会员分享,可在线阅读,更多相关<单片机C语言编程应注意的若干问题(4页珍藏版)>请在人人文库网上搜索. 1.单片机C语言编程应注意的若干问 ...

最新文章

  1. 【bzoj1251】序列终结者(伸展树)
  2. 使用VS2008怎么连接自带的SQL Server2005的Express版本数据库
  3. python实现模逆运算
  4. C语言获取mysql表数据结构_【数据结构】实现顺序表(c语言)
  5. js中页面与页面传参遇到Uncaught SyntaxError: Unexpected token =报错
  6. 如何ping端口_干货 | 如何正确处理常见的8大网络故障
  7. [转载] python判断是否为json_Python判断变量是否为Json格式的字符串示例
  8. Linux内核的Kmemleak实现内存泄露检测
  9. Server concepts 详解
  10. 大疆机器学习算法岗笔试
  11. Tkinter教程(每天半小时,3天彻底掌握Tkinter)day2
  12. macbook更新系统服务器,苹果电脑如何升级系统_苹果电脑怎么更新版本-win7之家...
  13. 动感歌词制作与转换工具(QRC, KRC, LRC, KSC, TRC) 1.2.9版本
  14. java小球与小球碰撞_Java实现小球间的弹性碰撞(考虑小球质量)
  15. S4 HANA 1809 FPS03 Standard装机总结(刘欣2019.11.7)
  16. uniapp平台使用vant组件按需引入,并兼容到微信、百度、抖音小程序
  17. 【慕课-湖南大学】服务设计与商业模式
  18. 线性代数系列(1)行列式
  19. 如何用Python设计一个简易的文本敏感词过滤器
  20. 古魂魂之刃2电脑版用逍遥模拟器电脑上玩手机账号数据互通

热门文章

  1. 一进商场就迷路?谷歌用AR拯救路痴,起底室内导航黑科技
  2. 在小米应用商店提交app之攻略
  3. 思考网游企业的上市浪潮
  4. spring 注解方式 事务管理
  5. char 类型的操作函数
  6. 命令行批量合并视频脚本
  7. 柯西不等式证明(cauchy不等式)
  8. 微信小程序,从excel表格复制粘贴后数据录入,以及json转excel格式
  9. Video Object Segmentation with Adaptive Feature Bank and Uncertain-Region Refinement论文解读和代码实践
  10. Bayesian Compression for Deep Learning 阅读笔记