和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS
关于bfs:
你怎么会连这个都不知道!!!自己好好谷歌一下!!!(其实我也刚学)
bfs伪代码:
while(队列非空){
取出队首元素u;
弹出队首元素;
u染色为黑色;
for(int i=0;i<u的出度){
if(i非白色) continue;
u的第i个出线连着的点入队;
i染为灰色;
}
}
可爱的分割线
无权最短路
显然,你在洛谷上是搜不到这题的,因为这是我们学校团队的题。所以还是找个小板凳专心听我讲吧。
题目描述:
给定无权无向图G(V,E)和源点s/终点t,求 s->t 的最短路径。
假设读入边的列表是有(字典)序的(既邻接表就是有序的)。
输入输出格式:
输入格式:
第一行包含4个整数N、M、s、t,表示该图共有N个结点和M条无向边。(N <= 5000,M <= 200000)。起点为s,终点为t。
接下来M行,每行包含2个整数{u,v},表示有一条无向边连接结点u、v
输出格式:
输出最短路的长度(边数)
若无法到达,输出"No path"
样例:
输入:
4 3 1 4
1 2
1 3
2 4
输出:
2
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
const int NR=5005;
using namespace std;
struct Edge{
//一个存储权值的结构体,为bfs模板,此题无用
int v,w;
Edge(int v,int w):v(v),w(w){}
};
vector<Edge> save[5005];//邻接表
int d[NR];//记录距离的数组
int main()
{
int n,m,s,t;
cin>>n>>m>>s>>t;//输入
char color[n+1];//判断是否去过(没去过:"w",正在考虑(在队列中):"g",已经完全考虑:"b")
memset(color,'w',sizeof(color));//染色数组重置为白色
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;//输入每条线的起点和终点
save[a].push_back(Edge(b,1));//因为是无向图,所以在起点连接的点中增加终点
save[b].push_back(Edge(a,1));//还要在终点连接的点中增加起点
}
d[s]=0;//起点距离起点的距离设为零
queue<int> q;//bfs处理队列
q.push(s);//起点入队
color[s]='g';//起点染色成灰色
while(!q.empty()){
int u=q.front();//取出队首的一项
q.pop();//弹出
color[u]='b';//标记为黑色
for(int i=0;i<save[u].size();i++){//拓展出所有子节点
if(color[save[u][i].v]!='w') continue;
if(save[u][i].v==t){
cout<<d[u]+1;//如果这个位置是终点,则输出
return 0;
}
d[save[u][i].v]=d[u]+1;//计算距离
color[save[u][i].v]='g';//染灰色
q.push(save[u][i].v);//进队
}
}
cout<<"No path";
return 0;
}
和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS的更多相关文章
- 和小哥哥一起刷洛谷(5) 图论之深度优先搜索DFS
关于dfs dfs伪代码: void dfs(s){ for(int i=0;i<s的出度;i++){ if(used[i]为真) continue; used[i]=1; dfs(i); } ...
- 和小哥哥一起刷洛谷(8) 图论之Floyd“算法”
关于floyd floyd是一种可以计算图中所有端点之间的最短的"算法",其伪代码如下: for(所有起点i) for(所有终点j) 如果i=j: i到j最短路设为0 如果i与j相 ...
- 和小哥哥一起刷洛谷(7) 图论之dijkistra算法
关于dijkstra 维基百科 戴克斯特拉算法(英语:Dijkstra's algorithm,又译迪杰斯特拉算法)由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出.戴克斯特拉算法使用了广度优先 ...
- 和小哥哥一起刷洛谷(6) 图论之SPFA算法
关于\(spfa\) spfa伪代码: void spfa(s){ 最短路数组全部设为无限大; 队列 q; 起点s入队; s离s的距离设为零; while(队列非空){ 取出队首;弹出队首; for( ...
- 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)
莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...
- P4554 小明的游戏 (洛谷) 双端队列BFS
最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...
- 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...
- 洛谷 P1126 机器人搬重物 (BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...
- AC日记——小A的糖果 洛谷七月月赛
小A的糖果 思路: for循环贪心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defi ...
随机推荐
- Vue props用法详解
Vue props用法详解 组件接受的选项之一 props 是 Vue 中非常重要的一个选项.父子组件的关系可以总结为: props down, events up 父组件通过 props 向下传递数 ...
- C语言编译器
我们分两部分介绍C语言的编译器,分别是桌面操作系统和嵌入式操作系统. 桌面操作系统 对于当前主流桌面操作系统而言,可使用 Visual C++.GCC 以及 LLVM Clang 这三大编译器. Vi ...
- You may need to add '192.168.55.10' to ALLOWED_HOSTS.
DisallowedHost at / Invalid HTTP_HOST header: '192.168.55.10:8000'. You may need to add '192.168.55. ...
- 码云和Git使用说明
Git下载网站: https://git-scm.com/download/win 码云网站 :https://gitee.com 下载Git,并一路下一步安装. 鼠标空白处右键点击,出现两个 ...
- django后台xadmin如下配置(小结)
django-admin文档:https://xadmin.readthedocs.io/en/latest/index.html目录: 1.xadmin基本配置 2.配置后台显示的模型类 3.后台注 ...
- mysql 登录报错
执行命令:mysql -u root -p 错误:error while loading shared libraries: libncurses.so.5: cannot open shared o ...
- DeferredResult使用方式和场景
为什么使用DeferredResult? API接口需要在指定时间内将异步操作的结果同步返回给前端时: Controller处理耗时任务,并且需要耗时任务的返回结果时: 当一个请求到达API接口,如果 ...
- Keras神经网络data generators解决数据内存
在使用kears训练model的时候,一般会将所有的训练数据加载到内存中,然后喂给网络,但当内存有限,且数据量过大时,此方法则不再可用.此博客,将介绍如何在多核(多线程)上实时的生成数据,并立即的送入 ...
- Union-Find(并查集): Quick union算法
Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost( ...
- Chocolatey——windows下的包管理器
前言 windows 包管理器 | https://chocolatey.org/ 命令 文档 | https://chocolatey.org/docs 根据使用会补充命令