和小哥哥一起刷洛谷(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 ...
随机推荐
- 谷歌浏览器解决ajax跨域问题
在用mui和H5+做混合开发,会利用HBuildx去真机调试,可真机调试总有问题所在,懂得人自然懂,而我们直接打开页面显示的只有一个静态的页面,是获取不到数据的在这里我想说的不是代码中利用jsonp, ...
- Django ORM整理
字段类型 # 自增长 Auto = models.AutoField() BigAuto = models.BigAutoField() # 二进制 Binary = models.BinaryFie ...
- .NET CORE 技术债
技术债:OCELOT 网关/熔断/降级/限流CONSUL 服务注册/发现CAP 分布式事件总线SKYWALKING 微服务监控
- SQL SERVER-解析Extendevent文件数据
--解析xel数据 select SWITCHOFFSET(n.value('@timestamp','Datetime'),'+08:00') as EventTime, n.value('(dat ...
- SQL SERVER-修改TempDB路径
--查看tempdb文件信息 use tempdb go sp_helpfile go --修改路径 use master go Alter database tempdb modify file ( ...
- Vue检测当前是否处于mock模式
Vue检测当前是否处于mock模式 1.在main.js中声明全局变量: import Vue from 'vue' /* 全局变量 */ var GLOBAL_VARIABLE = { isMock ...
- three.js展示三维模型
1.概要 最近学习Three.js,尝试加载一些3d max导出的obj.stl模型,在展示模型的时候遇到了一些问题,模型的尺寸.位置和旋转角度每次都靠手工调整,非常的不方便,就想着写一个方法来随心所 ...
- mysql_safe和mysql_multi
1 mysql_safe 原理 mysqld_safe其实为一个shell脚本(封装mysqld),启动时需要调用server和database(即/bin和/data目录),因此需要满足下述条件之一 ...
- MySQL 空事务
问题描述; 研发同事反应MySQL数据库有锁,检查innodb_trx时,发现有很多长时间未结束的空事务. 这些事务的trx_mysql_thread_id都为0,因此不能通过kill ...
- git 常见的命令和错误