bfs输出路径 && 最短路(迪杰斯特拉)输出路径
问题描述

解决方法
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输出路径 && 最短路(迪杰斯特拉)输出路径的更多相关文章
- 最短路——迪杰斯特拉算法 HDU_3790
初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )
题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...
- HUD 2544 最短路 迪杰斯特拉算法
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 2544最短路 (迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Me ...
- pat1003 迪杰斯特拉法和dfs求最短路
本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解 是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...
- 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 ...
- 最短路之Dijkstra(迪杰斯特拉)
一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...
随机推荐
- RecyclerView 源码分析(一) —— 绘制流程解析
概述 对于 RecyclerView 是那么熟悉又那么陌生.熟悉是因为作为一名 Android 开发者,RecyclerView 是经常会在项目里面用到的,陌生是因为只是知道怎么用,但是却不知道 Re ...
- mysql的导入
方法1 load data [local] infile 'filename' into table tablename[option] ields terminated by 'string'(字段 ...
- MATLAB图像处理_Bayer图像处理 & RGB Bayer Color分析
Bayer图像处理 Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 ...
- COLMAP简易教程(命令行模式)
完整的 multi view stereo pipeline 会有以下步骤 structure from motion(SfM)==> camera parameters, sparse poi ...
- Let’s Encrypt/Certbot移除/remove/revoke不需要的域名证书
1.首先确认你的证书不再需要,如果有必要,请执行下面的命令进行备份 cp /etc/letsencrypt/ /etc/letsencrypt.backup -r 2.撤销证书然后删除证书 [root ...
- trust an HTTPS connection 安全协议 随机数 运输层安全协议 应用层安全协议 安全证书
小结: 1.HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间) HTTPS(全称:Hyper Text Transfer Protocol over Secure ...
- Feign配置日志的打印级别
一.细粒度的配置Feign的日志级别(针对每个微服务配置) 1.java代码方式 (1)在Feign接口注解上面配置configuration /** * @author : maybesuch * ...
- Shell 简单入门教程
大数据开发岗为什么要学习Shell呢?1)需要看懂大数据运维岗人员编写的Shell程序.2)偶尔会编写一些简单Shell程序来管理集群.提高开发效率 艺多不压身 Shell是一个命令行解释器,它接受应 ...
- Redis-第六章节-事务
目录 简介 执行过程 特点 案例 watch 简介 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 执行 ...
- mysql本地中127.0.0.1连接不上数据库怎么办
首先在本地使用Navicat for MySQL建立一个bai数据库.在dreamweaver中建立一个PHP格式的网页,方便链接测试.测试发du现,如果zhi无法使用localhost链接mysql ...