问题描述

解决方法

1、像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现

2、换乘次数最少,那就用bfs广搜来寻找答案。但是我的代码不能保证这个最少换乘是最短路程

代码

  1 #include<stdio.h>
2 #include<iostream>
3 #include<algorithm>
4 #include<string.h>
5 #include<queue>
6 #include<vector>
7 using namespace std;
8 const int maxn=1e3;
9 const int INF=0x3f3f3f3f;
10 int on[maxn],v[maxn];
11 //on数组是用来记录路径的
12 //v数组是用来记录最短路径长度的
13 struct shudui
14 {
15 int x,step;
16 };
17 struct shudui2
18 {
19 int x,value;
20 };
21 struct shudui1
22 {
23 int start,value;
24 bool operator < (const shudui1 q)const //这个是用于优先队列,最短路算法采用”迪杰斯特拉+堆优化“
25 {
26 return value<q.value;
27 }
28 };
29 vector<shudui2>w[maxn]; //定义一个shudui2类型的vector容器
30 void bfs(int st,int en) //这个是用bfs找到最少换乘次数
31 {
32 //st代表起点,en代表终点
33 int ans=INF;
34 shudui str1,str2;
35 system("cls");
36 int flag=0;
37 memset(on,0,sizeof(on));
38 queue<shudui>r;
39 //为bfs搜索创建一个队列
40 str1.x=st;
41 str1.step=0;
42 r.push(str1);
43 while(!r.empty())
44 {
45 str1=r.front();//从队列头取元素
46 r.pop();
47 int x=str1.x;
48 for(int i=0; i<w[x].size(); ++i) //遍历x这个点能到达的所有点,把它们都加入到队列中
49 {
50 str2.x=w[x][i].x;
51 on[str2.x]=str1.x; //记录路径
52 if(w[x][i].x==en) //这就代表找到了最短路径
53 {
54 int index=en;
55 flag=1;
56 printf("最短换乘%d次\n",str1.step);
57 printf("以下是路径\n");
58 printf("%d",index);
59 while(on[index]>0) //循环打印路径
60 {
61 index=on[index];
62 printf("--->%d",index);
63 if(index==st) break;
64 }
65 printf("\n");
66 break;
67 }
68
69 str2.step=str1.step+1; //每换乘一次要加1
70 r.push(str2);
71 }
72 if(flag) break;
73 }
74 while(!r.empty()) r.pop();
75 if(!flag)
76 {
77 printf("没有通向此处航线\n");
78 }
79 }
80 void JK(int s,int e) //迪杰斯特拉算法求最短路
81 {
82 //s是起点,e是终点
83 system("cls");
84 memset(on,0,sizeof(on));
85 memset(v,INF,sizeof(v));
86 priority_queue<shudui1>r;
87 shudui2 str2;
88 shudui1 str1;
89 v[s]=0;
90 str1.start=s;
91 str1.value=0;
92 r.push(str1); //把起点放入优先队列
93 while(!r.empty())
94 {
95 int x,y;
96 str1=r.top(); //从优先队列头拿出元素
97 r.pop();
98 x=str1.start;
99 y=str1.value;
100 if(v[x]<y) continue;
101 //说明在这个点再此之后又入队了
102 //此次出队的并不是s到这个点的最短路,
103 //所以在这次更新前点v所连的点已经更过一次了
104 //所以后面也不会进行松弛操作
105 int len=w[x].size();
106 for(int i=0; i<len; ++i) //
107 {
108 str2=w[x][i];
109 if((v[x]+str2.value<v[str2.x])) //遍历x这个点能到达的所有点,把它们都加入到队列中
110 {
111 on[str2.x]=x; //记录路径
112 v[str2.x]=v[x]+str2.value;
113 str1.start=str2.x;
114 str1.value=v[str2.x];
115 r.push(str1);
116 }
117 }
118 }
119 printf("最短路径长度为%d\n",v[e]);
120 printf("路径如下\n");
121 printf("%d",e);
122 int x=e;
123 while(on[x]>0) //循环打印路径
124 {
125 x=on[x];
126 printf("-->%d",x);
127 }
128 printf("\n");
129 }
130 int main()
131 {
132 int n,m,x;
133 printf("输入有几个点,有几条边\n");
134 scanf("%d%d",&n,&m);
135 printf("依次输入每条路线的起点、终点、距离\n");
136 while(m--)
137 {
138 shudui2 str2;
139 int x,y,z;
140 scanf("%d%d%d",&x,&y,&z);
141 str2.x=y;
142 str2.value=z;
143 w[x].push_back(str2); //往vector容器里面添加元素
144 str2.x=x;
145 w[y].push_back(str2);
146 }
147 while(1)
148 {
149 int s,e;
150 system("cls");
151 printf ( " \n");
152 printf ( " \n");
153 printf ( " \n");
154 printf ("-------------------------------------- \n");
155 printf ("--------------------------------------\n");
156 printf ("--------丨[0]最短路程 丨---\n");
157 printf ("--------丨[1]最少换乘 丨---\n");
158 printf ("--------丨[2]结束 丨---\n");
159 printf ("----------输入相应数字----------------\n");
160 printf ("--------------------------------------- \n");
161 printf ( " \n");
162 printf ( " \n");
163 scanf("%d",&x); //正常if判断语句
164 if(x==0)
165 {
166 printf("输入终点编号、起点编号\n");
167 scanf("%d%d",&s,&e);
168 JK(s,e);
169 }
170 else if(x==1)
171 {
172 printf("输入终点编号、起点编号\n");
173 scanf("%d%d",&s,&e);
174 bfs(s,e);
175 }
176 else if(x==2)
177 {
178 break;
179 }
180 else printf("输入格式不正确\n");
181 system("pause");
182 }
183 return 0;
184 }
185 /*
186 测试数据
187 5 5
188 1 2 20
189 2 3 30
190 3 4 20
191 4 5 20
192 1 5 100
193 */

bfs输出路径 && 最短路(迪杰斯特拉)输出路径的更多相关文章

  1. 最短路——迪杰斯特拉算法 HDU_3790

    初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...

  2. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )

    题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  4. HUD 2544 最短路 迪杰斯特拉算法

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  7. pat1003 迪杰斯特拉法和dfs求最短路

    本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解  是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...

  8. hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. 最短路之Dijkstra(迪杰斯特拉)

    一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...

随机推荐

  1. 【Linux】saltstack的使用详解 超详细

    一.salt常用命令 salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令 salt [options] '<target>' <function ...

  2. SAP里会话结束方法(杀死进程)

    在SAP的ERP里,有很多方法可以结束一个会话,然而在不同情况下,需要使用的方法也不同.下面从先后顺序来简单说明:1.SM04:最常用的方法,在SM04点击工具栏的会话->结束会话,来关闭一个会 ...

  3. ALV中layout布局控制详解

    参数的结构为SLIS_LAYOUT_ALV.结构中比较常用的字段如下: no_colhead      隐藏列标题          值为X或空 no_hotspot     headings不作为热 ...

  4. uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息

    Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取.因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许. 读写手机存储权 ...

  5. centos7制作U盘启动盘-九五小庞

    一.准备相关软件 1.8G以上U盘 2.UltraISO虚拟光驱(试用版即可)最新版 下载地址:https://cn.ultraiso.net/xiazai.html  点击下载试用 3.CentOS ...

  6. centos7服务器远程安装图形化页面

    以下是我用云的centos 7.4的安装步骤,照着我的命令操作肯定OK的,其他的就不敢保证了... 1.首先安装X(X Window System),命令为:(注意有引号) yum groupinst ...

  7. Python+Selenium+Unittest实现PO模式web自动化框架(2)

    1.Common目录下的具体模块讲解. 2.basepage.py basepage.py模块里面是封装的对元素的操作.例如:查找元素.点击元素.文本输入等等. # --^_^-- coding:ut ...

  8. 3、剑指offer-数组——数组中重复的数字

    *题目描述* **在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输 ...

  9. Nginx配置代理gRPC的方法

    Nginx配置代理gRPC的方法_nginx_脚本之家 https://www.jb51.net/article/137330.htm

  10. springboot2.2.2集成6.5 Elasticsearch

    1.0POM文件 <!-- spring-boot --> <dependency> <groupId>org.springframework.boot</g ...