其实这个示例是在大一数据结构课程设计的时候选的题目,只不过在昨天的算法分析与设计实验课上又看到了求加权图的最短路径,忽然想起当初课程设计时为了弄懂Floyd算法而不断抓狂的过程,觉得有必要将它从邮箱的角落里释放出来,来见证自己一步步的成长。也希望能和大家一起成长。

  啰嗦完了,下面进入正题吧!

  1.系统需求分析:

    1、设计你的学校的校园平面图,所选的景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

    2、为来往客人提供图中任意景点相关信息的查询。

    3、为来往的客人提供图中任意景点的问路查询,即查询任意两个景点间的一条最短的简单路径。

  2.系统功能模块设计

  本系统分为三个模块:菜单模块 、路径查询模块、最短路径模块。得到如图所示的系统功能模块图。

    

  3.算法思想描述将结合源码进行分析

  4.源代码:

  

  1 #include<stdio.h>
  2 #include<string.h>
  3 #define Num 13
  4 #define Maxedge 5000
  5
  6 typedef struct//定义结构型
  7 {
  8     char name[10] ;
  9     int number;
 10 }vertex;
 11 vertex ver[Num];
 12 int edge[Num][Num];
 13 int shortest[Num][Num];
 14 int path[Num][Num];
 15
 16 void show2()//输出各地点名称
 17 {
 18     int i=1;
 19
 20     for(i=1;i<=Num;i++)
 21     {
 22         printf("%d---%s\t",i,ver[i].name);
 23     }
 24     printf("\n\n");
 25 }
 26
 27 void init()//初始化地点和长度
 28 {
 29     int i,j;
 30     ver[1].number =1;
 31     strcpy(ver[1].name,"文学院");
 32     ver[2].number =2;
 33     strcpy(ver[2].name,"学校西门");
 34     ver[3].number =3;
 35     strcpy(ver[3].name,"一号餐厅");
 36     ver[4].number =4;
 37     strcpy(ver[4].name,"溜冰场");
 38     ver[5].number =5;
 39     strcpy(ver[5].name,"喷泉广场");
 40     ver[6].number =6;
 41     strcpy(ver[6].name,"山顶操场");
 42     ver[7].number =7;
 43     strcpy(ver[7].name,"图书馆");
 44     ver[8].number =8;
 45     strcpy(ver[8].name,"十号教学楼");
 46     ver[9].number =9;
 47     strcpy(ver[9].name,"服务楼");
 48     ver[10].number =10;
 49     strcpy(ver[10].name,"体育馆");
 50     ver[11].number =11;
 51     strcpy(ver[11].name,"行政楼");
 52     ver[12].number =12;
 53     strcpy(ver[12].name,"学校北门");
 54     ver[13].number =13;
 55     strcpy(ver[13].name,"水房");
 56
 57     for(i=1;i<=Num;i++)//初始化每天路径为最大值
 58     {
 59        for(j=1;j<=Num;j++)
 60        {
 61           edge[i][j]=Maxedge;
 62        }
 63     }
 64     //自身到达自身为0
 65     for(i=1;i<=Num;i++)
 66     {
 67         edge[i][i]=0;
 68     }
 69     //为顶点间路径赋值
 70     edge[1][2]=edge[2][1]=20;
 71     edge[1][5]=edge[5][1]=240;
 72     edge[2][3]=edge[3][2]=50;
 73     edge[2][4]=edge[4][2]=15;
 74     edge[2][6]=edge[6][2]=20;
 75     edge[3][4]=edge[4][3]=100;
 76     edge[4][6]=edge[6][4]=70;
 77     edge[4][9]=edge[9][4]=50;
 78     edge[5][6]=edge[6][5]=10;
 79     edge[6][10]=edge[10][6]=340;
 80     edge[6][7]=edge[7][6]=40;
 81     edge[7][8]=edge[8][7]=60;
 82     edge[7][10]=edge[10][7]=50;
 83     edge[8][9]=edge[9][8]=20;
 84     edge[8][11]=edge[11][8]=140;
 85     edge[9][11]=edge[11][9]=260;
 86     edge[10][12]=edge[12][10]=110;
 87     edge[10][13]=edge[13][10]=210;
 88 }
 89
 90 char show3()//功能选项
 91 {
 92     char i;
 93     printf("\t\t\t           功能菜单\n");
 94     printf("--------------------------------------------------------------------------------");
 95     printf("\t\t\t<1> 查看校园各地点代号请输入 1\n");
 96     printf("\t\t\t<2> 最短路径查询请输入       2\n");
 97     printf("\t\t\t<3> 退出系统请输入           3\n");
 98     printf("--------------------------------------------------------------------------------");
 99     printf("          \t\t^.^ 您的选择:");
100     scanf("%s",&i);
101     return i;
102 }
103
104 void floyd()//弗洛伊德算法求两点最小权值
105 {
106     int i=1,j=1,k=1,l=1;
107     for(i=1;i<=Num;i++)
108     {
109         for(j=1;j<=Num;j++)
110         {
111             shortest[i][j]=edge[i][j];
112             path[i][j]=0;
113         }
114     }
115     for(k=1;k<=Num;k++)
116     {
117         for(i=1;i<=Num;i++)
118         {
119             for(j=1;j<=Num;j++)
120             {
121                 if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))
122                 {
123                     shortest[i][j]=(shortest[i][k]+shortest[k][j]);
124                     path[i][j]=path[j][i]=k;
125                 }
126             }
127         }
128     }
129 }
130
131 void show4(int i,int j)//显示最短路径及长度。
132 {
133     int k=0,a=i,b=j;
134     if(shortest[i][j]!=Maxedge)
135     {
136         printf("从 %s 到 %s 的最短路径为:\n",ver[i].name,ver[j].name);
137         printf("%s",ver[i].name);
138         while(path[i][j]!=0)
139         {
140             k=path[i][j];
141             while(path[i][k]!=0)
142             {
143                 k=path[i][k];
144             }
145             printf("----%s",ver[k].name);
146             i=k;
147         }
148         printf("----%s;\n",ver[j].name );
149         printf("最短距离为:%d米。\n",shortest[a][b]);
150     }
151     else
152         printf("从 %s 不能到达 %s 。",ver[i].name ,ver[j].name );
153 }
154
155 void shortestpath()//功能2:接受两地点并调用Floyd算法生成最短路径矩阵
156 {
157     int i=0,j=0;
158     while(1)
159     {
160
161         printf("请输入要查询的两点的编号:(以空格间隔)");
162         scanf("%d%d",&i,&j);
163         if(i<=Num&&i>0&&j<=Num&&j>0)
164         {
165             floyd();
166             show4(i,j);
167             return;
168         }
169     }
170 }
171
172 void main()//主程序
173 {
174     int z;
175     char i;
176     system("color 5f");//更改窗口颜色
177     init();//初始化参数
178     {
179         printf("\t\t\t    ************************\n");
180         printf("\t\t\t    **河南城建学院校园导航**\n");
181         printf("\t\t\t    ************************\n\n\n\n\n");
182         while(true)//用循环使可以多次选择选项
183         {
184             i=show3();//调用函数显示功能菜单
185             switch(i)//功能菜单选项
186             {
187                 case '1':show2();break;
188                 case '2':shortestpath();break;
189                 case '3':{
190                     system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\t\t   谢谢您的使用\n\n\n\t\t\tO(∩_∩)O~~\t\tO(∩_∩)O~~\n\n\n\n\n\n\n\n\n");
191                     system("pause");
192                     exit(0);    //退出程序
193                 }
194                 default :printf("输入错误!\n");break;
195             }
196         }
197     }
198 }

运行结果:

弗洛伊德算法思想:其实很简单,就是求出所有顶点两两之间的最短路径,如果该两点之间存在第三个顶点构成最短路径,则将该顶点的顶点号存入一个path[][]矩阵中,并将长度赋值给shortest[][]数组中!

其实它的核心代码只有这一段:

 1 for(k=1;k<=Num;k++)
 2     {
 3         for(i=1;i<=Num;i++)
 4         {
 5             for(j=1;j<=Num;j++)
 6             {
 7                 if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))
 8                 {
 9                     shortest[i][j]=(shortest[i][k]+shortest[k][j]);
10                     path[i][j]=path[j][i]=k;
11                 }
12             }
13         }
14     }

  事先定义出两个二维数组,shortest[i][j]中存放的是顶点i到顶点j的最短路径长度。path[i][j]的值存放的是顶点i到顶点j之间最短路径经过的顶点的值,即如果顶点i和顶点j之间存在顶点k,使i到k的距离加上k到j的距离,则将这个最短距离存入shortest[i][j]中,并将path[i][j]的值设为k,这样在寻址最短路径的时候只要根据path[i][j]中的值一步步反推出即可。

转载于:https://www.cnblogs.com/rookieFly-tdiitd/p/4948679.html

校园导航系统之用弗洛伊德算法求加权图的最短路径相关推荐

  1. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...

    有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...

  2. .弗洛伊德算法求最短路径

    5. 弗洛伊德算法求最短路径 [问题描述] 对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径. [输入形式] 顶点个数n,以及n*n的邻接矩阵,其中不可达使 ...

  3. 弗洛伊德(Floyd)算法求图的最短路径

    弗洛伊德基本思想 弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好. 基本思想: 弗洛伊德算法定义了两个二维矩阵: 矩阵D记录顶点间的最小路径 例 ...

  4. 51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)

    1445 变色DNA 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一只特别的狼,它在每个夜晚会进行变色,研究发现它可以变成N种颜色之一,将这些颜色标号为0,1 ...

  5. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  6. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  7. Dijkstra算法求单源最短路径

    1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶 ...

  8. 迪杰斯特拉算法求经纬度坐标的最短路径_【图的最短路径】迪杰斯特拉算法求图的最短路径...

    #include using namespace std; const int INFINITY=23678; const int M=3; /*typedef struct G { int ver[ ...

  9. AOJ GRL_1_A: Single Source Shortest Path (Dijktra算法求单源最短路径,邻接表)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A Single Source Shortest Path In ...

最新文章

  1. 四连通,和八连通的详解(MATLAB)
  2. EmbeddedWebBrowser(EmbeddedWB)不显示图片
  3. 编码实现Spring 利用@Resource注解实现bean的注入,xml实现基本数据类型的注入
  4. linux 命令改配置文件,linux下 修改配置文件的命令
  5. IDOC实例,消息方式的IDOC
  6. C#中对文件File常用操作方法的工具类
  7. 【Linux】一步一步学Linux——unset命令(202)
  8. css background size
  9. php输入数据提交排序,排序php数据var
  10. service获取selinux权限_Spring Boot 整合 Spring Security 示例实现前后分离权限注解 + JWT 登录认证...
  11. 使用自定义端口连接SQL Server 2008的方法
  12. 网络编程 upd 发送接收数据
  13. 日记侠:写文章快速赚钱的方法就3个字
  14. Oracle删除数据消耗时间大吗,oracle 删除大量数据的方法
  15. “差生”韩寒难以改变的人生戏码
  16. 微信小程序---显示与隐藏hidden
  17. leetcode 最长单词
  18. 基于浏览器的Linux
  19. 如何绘制最美的鱼骨图?
  20. java 制表符 宽度不够_有没有办法强制使用制表符而不是Java中的空格?

热门文章

  1. [国家集训队]阿狸和桃子的游戏(贪心)
  2. 什么是局域网监控?是如何监控的...
  3. linux卡死怎么办
  4. 【设计】1359- Umi3 如何实现插件化架构
  5. 【华为OD机试真题 C语言】机器人走迷宫
  6. PWM的基本原理及其应用实例
  7. 软件测试作业1 令我印象深刻的bug
  8. PAT乙级——1003
  9. 如何避免2.4GHz ISM频段下各种无线设备的干扰
  10. 数模电路基础知识 —— 5. 常见电路符号说明(三极管)