算法知识:bfs(图的遍历),单源最短路径

牛客16498寻找道路题解

题目大意,给定一个n个点和m条边的有向图,求一条从起点到终点最短路径,要求路径上所有的点直接或者间接与终点相连。(每条边边权为1),图中可能有自环或者重边

例如图中的点2,因为其所指向的点6没有与终点5建立关系,所以不能够在最短路径考虑范围内(尽管1->2->5距离是该图中,起点到终点的最短路径)

这种情况最短路径是,1->3->4->5,距离为3

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e4+5;
vector<int> G[maxn];//用来表示每个点存储的边
int vis1[maxn];//两遍bfs分别用到的标记数组
int vis2[maxn];
int s,t;//起点和终点
int n,m;
queue<int> q;
int dis[maxn];//记录最短距离
int main ()
{memset(dis,0,sizeof(dis));scanf ("%d %d",&n,&m);for (int i=1;i<=m;i++){int x,y;scanf ("%d %d",&x,&y);if (x==y) continue;//如果出现自环则跳过G[y].push_back(x);//原本是从x指向y的一条边,现在将边反向预处理,用来后面从终点向起点开始bfs的处理}scanf ("%d %d",&s,&t);vis1[t]=1;q.push(t);//从终点开始遍历,标记路径上所有的点while (!q.empty()){int now=q.front();q.pop();for (int i=0;i<G[now].size();i++){if (!vis1[G[now][i]]){vis1[G[now][i]]=1;q.push(G[now][i]);}}}//vis1这个标记数组已经处理好了从终点能够遍历到的点//vis2用来清理不合法的点memcpy(vis2,vis1,sizeof(vis2));for (int i=1;i<=n;i++){if (!vis1[i]){//未被标记,说明该点与终点没有直接或者间接关系for (int j=0;j<G[i].size();j++){if( vis2[G[i][j]]){//但是与该点相连的边跟终点有关系,还是得清除,不合题意vis2[G[i][j]]=0;}}}}//两遍标记,已经处理好了所有的合法点,所以我们再次bfs求最短路径即可q.push(t);dis[t]=0;while (!q.empty()){int now=q.front();q.pop();for( int i=0;i<G[now].size();i++){if (vis2[G[now][i]]){vis2[G[now][i]]=0;q.push(G[now][i]);dis[G[now][i]]=dis[now]+1;}}}if( dis[s]==0){printf("-1\n");}else {printf("%d\n",dis[s]);}return 0;
}

牛客NC16498寻找道路题解相关推荐

  1. 牛客网sql练习题解(12-21)

    文章目录 简介 NO.12 NO.13 NO.14 NO.15 NO.16 NO.17 NO.18 NO.19 NO.20 NO.21 简介 按时来更,感觉题目不是很难,不过我有一个感觉就是虽然题目简 ...

  2. 牛客网sql练习题解(22-32)

    文章目录 简介 NO.22 NO.23 NO.24 NO.25 NO.26 NO.27 NO.28 NO.29 NO.30 NO.31 NO.32 简介 往期文章: 牛客网sql练习题解 (1-11) ...

  3. 牛客竞赛14346凌波微步题解

    牛客竞赛14346凌波微步题解 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 一.题目描述 小Z的体型 ...

  4. 牛客小白月赛19 题解

    牛客小白月赛19 A. 「水」滔天巨浪(思维) B. 「木」迷雾森林 (数字三角形模型) C. 「土」秘法地震(二维前缀和) F. 「水」悠悠碧波 (字符串) D. 「金」初心如金 (找规律) G. ...

  5. 2022 牛客竞赛 月赛60 题解

    为了第一次写题解而去打小白月赛,本来以为可以很快AK的,但是最后卡在了最后一题,只ac了5题.前三题太水了,于是我从第四题开始给题解. D 游戏购买! 这题主要考验大家的算法基本功,一般的爆搜会超时, ...

  6. 2022牛客多校2题解报告(同步自语雀)

    一.赛后总结 总结就是缺乏清晰的大脑,当然一切的一切归因于实力不足. 开局看K,半个小时推出DP式子,交了就WA.差错没查出来,写了暴力对拍,就去看D了.后来拍了3个小时也没出问题...可能是数据生成 ...

  7. 牛客网C语言题解1-指针

    说明:笔者水平有限,这当做个人学习C语言的笔记,如有错误欢迎指出和讨论. 题目 求程序运行结果 #include<stdio.h> void foobar(int a, int *b, i ...

  8. 牛客小白月赛27题解(部分)

    链接:https://ac.nowcoder.com/acm/contest/6874 来源:nowcoder 文章目录 A 巨木之森(树的直径) B 乐团派对(贪心) D 巅峰对决(线段树) E 使 ...

  9. 牛客小白月赛30题解

    A 黑白边 有n个点,m条边,每条边都分为黑边和白边,现在要选一些边,使得所有点都可以相互连通,要求用白边的条数最少. 看到所有的点都相互连通,就可以想到生成树,所以把所有的白边和黑边分类,先用黑色的 ...

  10. 牛客小白月赛27 题解

    比赛时有点事,赛后补了一下题 A 巨木之森 题意就不复述了, 这题的核心内容就是树的直径. 观察下面的图可以发现,一个点遍历整棵树的路程就是 所有的边*2 - 从这个点出发所到的最远距离.根据树的直径 ...

最新文章

  1. linux服务器六个状态,六、Linux_SSH服务器状态
  2. python梦幻西游4小人_梦幻西游大漠插件过鼠标漂移和四小人
  3. java 并发_Java并发防范机制
  4. 南开大学计算机考研2019分数线,2019年南开大学考研复试分数线已公布
  5. 数据工作者的福音:Google 发布正式版数据搜索工具啦!
  6. (Node*)malloc(sizeof(Node))的理解
  7. 21天让你成为Horizon View高手—Day11:手动池的创建
  8. HDU2502 月之数【递推】
  9. 【a701】旅行家的预算
  10. vue汉王签字板_汉王ESP370U驱动下载|汉王签字板ESP370U驱动(附控件接口) - 驱动无忧...
  11. UOS 下wine的记录
  12. 微信公众账号开发教程(二) 基础框架搭建——转自http://www.cnblogs.com/yank/p/3392394.html...
  13. phpwind9.0 read.php 修改,phpwind9.0模板制作教程——制作论坛风格
  14. GEE学习:查询遥感影像空间分辨率
  15. jq 监听 radio 选择
  16. JZOJ 3158 【JSOI2013】丢番图
  17. WIN7下使用建行捷德U盾无法支付空白的解决办法
  18. 深度学习技巧应用7-K折交叉验证的实践操作
  19. Windows 和 Linux 下后台运行 Jar包
  20. PHP curl 需要301跳转

热门文章

  1. 目标检测数据集---交通信号数据集
  2. 使用雷达测量心率和呼吸频率项目(11)-Acconeer 探索工具
  3. 数据更新 | 409w+数据量级 | CnOpenData地方政府留言板文本数据
  4. 提高班毕业生与本科毕业生就业研究报告
  5. Linux shell/expect交互式脚本编写
  6. 2017省组队训练 zoj 3385Hanami Party (贪心+栈优化)
  7. vue再读74-单页应用SPA特点
  8. 北京大学计算机考研高数几,北大考研过来人数学150分经验谈
  9. Python编程:打造自己的表情包搜索引擎——附源代码
  10. 做外贸独立站通常会遇到哪些问题?