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算法是很有代 ...
随机推荐
- 【MySQL】DDL数据定义语言的基本用法create、drop和alter(增删改)
DDL 的基础语法 文章目录 DDL 的基础语法 对数据库进行定义 对数据表进行定义 创建表结构(数据表) 设计工具 修改表结构 小结 参考资料 简单复习一波 SQL必知必会 DDL 的英文全称是 D ...
- 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)
Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...
- EnvironmentPostProcessor怎么做单元测试?阿里P7解答
简介 从Spring Boot 1.3开始,我们可以在应用程序上下文刷新之前使用EnvironmentPostProcessor来自定义应用程序的Environment.Environment表示当前 ...
- 使用gui_upload的总结
今天使用gui_upload函数将文本文件的内容读取到内表.出现了一个问题,总是程序宕掉,出项的提示是 Type conflict when calling a function module. 原来 ...
- SourceGenerator入门指北
SourceGenerator介绍 SourceGenerator于2020年4月29日在微软的.net blog首次介绍,大概说的是开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代 ...
- JavaScript中eval的替代方法
引自:https://www.cnblogs.com/lxg0/p/7805266.html 通常我们在使用ajax获取到后台返回的json数据时,需要使用 eval 这个方法将json字符串转换成对 ...
- OpenCV 和 Dlib 人脸识别基础
00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...
- Django-html文件实例
1.实例1,登陆界面 <!DOCTYPE html> <head> <meta http-equiv="content-type" content=& ...
- Py数据类型—列表,字典,元组
列表:数据类型list. 写法li=[1,12,9,"sdsad",["ad","dd"] ].用中括号括起来,用逗号分割每个元素列表中元素 ...
- Python_1生成器(下)之单线并行--生产着消费者模型
1 import time 2 def consumer(name): 3 print('%s准备吃包子了!' %name) 4 while True: 5 baozi = yield 6 print ...