这边讲一下一般的解题思路,一般来说,我们做题都是将复杂化为简单。所以一般切题,我们都是看是否能够构造一个邻接矩阵。

对于邻接矩阵,但凡有一点算法基础都能知道它其中的一个作用就是用来描述数据之间的相互关系,而恰恰是一个点,我觉着就是最重要的一个点,因为可以描述每一个数据间的关系,所以,我们可以在一般给出数据间的相互关系以后,就进行构造邻接矩阵,然后利用队列的先进先的特点(每一次的队列都是对一层的数据),然后循环。大部分简单的问题就都可以解决了。

这边为了方便讲解,博主这边特别的去找了一个题目去做,顺带丢到这边,方便大家理解

题目是洛谷的一道题,题目如下:

​​​​​​P1332 血色先锋队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题完完全全的就是我刚刚说的那个方法,这道题用这个方法是最完美的!!!

然后这边再把这个题目给贴一下方便讲解:

题目背景

巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经开始调查瘟疫的源头。原来是血色先锋军的内部出现了叛徒,这个叛徒已经投靠了天灾军团,想要将整个血色先锋军全部转化为天灾军团!无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。

题目描述

军团是一个 nn 行 mm 列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一个小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间,并且将它报告给巫妖王,以便对血色先锋军进行一轮有针对性的围剿。

输入格式

第 11 行:四个整数 nn,mm,aa,bb,表示军团矩阵有 nn 行 mm 列。有 aa 个感染源,bb 为血色敢死队中领主的数量。

接下来 aa 行:每行有两个整数 xx,yy,表示感染源在第 xx 行第 yy 列。

接下来 bb 行:每行有两个整数 xx,yy,表示领主的位置在第 xx 行第 yy 列。

输出格式

第 11 至 bb 行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。如果某个人的位置在感染源,那么他感染瘟疫的时间为 00。

然后输入输出我就不贴了。

解题思路:

开一个二维的类数组,这个类是用来存储每一个数据的x与y的坐标的,还有一个是每一个数据的最早被感染的时间。还要设置一个boolean类型的数组,这个数组是用来存储数据的状态的,也就是看每一个数据是否有被访问到。

然后利用一个bfs的方法,方法在上文中我有进行一个讲解,也就是利用队列的那个,主要是利用bfs每一次遍历到这个位置的时候,我把这个位置的这个最小值进行一个更新,然后再利用那个boolean数组进行判断是否有被更新过,如果有被更新,则不加入这个队列。如此往复。

具体代码如下。

import java.util.*;
import java.io.*;
public class Main {/**** @author 19015**/static class FastScanner{BufferedReader buf;StringTokenizer stk;public FastScanner() {buf = new BufferedReader(new InputStreamReader(System.in),16584);eat("");}public void eat(String fa) {stk = new StringTokenizer(fa);}public String nextLine() {try {return buf.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();return null;}}public boolean hasNext() {while(!stk.hasMoreTokens()) {String s = nextLine();if(s == null) {return false;}eat(s);}return true;}public String next() {hasNext();return stk.nextToken();}public int nextInt() {return Integer.parseInt(next());}}static FastScanner in = new FastScanner();public static void main(String[] args) {// TODO 自动生成的方法存根while(in.hasNext()) {int x = in.nextInt();int y = in.nextInt();int a = in.nextInt();int b = in.nextInt();Datatemp[][] xy = new Datatemp[x][y];for(int i=0;i<x;i++) {for(int j=0;j<y;j++) {xy[i][j] = new Datatemp(i,j);}}boolean[][] xybol = new boolean[x][y];Queue tempchu = new LinkedList();Queue tempmo = new LinkedList();for(int i=0;i<a;i++) {int tempx = in.nextInt()-1;int tempy = in.nextInt()-1;tempchu.add(new Datatemp(tempx,tempy));xybol[tempx][tempy] = true;}for(int i=0;i<b;i++) {tempmo.add(new Datatemp(in.nextInt()-1,in.nextInt()-1));}fan(xy,xybol,tempchu);while(!tempmo.isEmpty()) {Datatemp temp = (Datatemp) tempmo.poll();System.out.println(xy[temp.x][temp.y].shu);}}}static void fan(Datatemp[][] xy,boolean[][] xybol,Queue tempchu) {int[][] shu = {{1,0},{0,1},{-1,0},{0,-1}};while(!tempchu.isEmpty()) {Datatemp temp = (Datatemp) tempchu.poll();for(int i=0;i<shu.length;i++) {if(temp.x+shu[i][0]>=0&&temp.x+shu[i][0]<xy.length&&temp.y+shu[i][1]>=0&&temp.y+shu[i][1]<xy[0].length&&!xybol[temp.x+shu[i][0]][temp.y+shu[i][1]]) {xy[temp.x+shu[i][0]][temp.y+shu[i][1]].shu=temp.shu+1;xybol[temp.x+shu[i][0]][temp.y+shu[i][1]]=true;tempchu.add(xy[temp.x+shu[i][0]][temp.y+shu[i][1]]);}}}}
}
class Datatemp{int x;int y;int shu;public Datatemp(int x,int y) {this.x = x;this.y = y;shu = 0;}
}

如果对你有帮助的话,还请点一个赞,这将会是我写作最大的支持!!!

谢谢!!

关于图的广度优先搜索—————洛谷1332相关推荐

  1. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  2. 图的广度优先搜索(bfs)以及深度优先搜索(dfs)

    1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂.因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中 ...

  3. 数据结构--图的广度优先搜索

    //图的遍历--广度优先搜索 void BreadFirstSearch(Graph g int v0){visit(v0);visited[v0] = True;InitQueue(&Q); ...

  4. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  5. 图的广度优先搜索遍历

    广度优先搜索遍历 广度优先搜索遍历类似与树的层次遍历,过程如下: (1) 从图中的某个顶点v出发,访问v (2) 依次访问v的各个未曾访问的邻接点 (3) 分别从这些邻接点出发依次访问他们的邻接点,并 ...

  6. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

  7. 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

    BFS和DFS算法解析 [算法入门] 2018/6/2 1.前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次. 但是图的遍历相对树而言要更为复杂. ...

  8. 图的广度优先搜索--python实现

    最近在看<算法图解>,第六章中的广度优先搜索中的题目.自己实现一遍,算是做个记录吧. 关系网络图如下: 目的:找到朋友与朋友的朋友这些人中,谁是 Seller. 大体思路: 首先使用散列表 ...

  9. 《算法图解》学习笔记(六):图和广度优先搜索(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

最新文章

  1. 线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)
  2. Java程序员之完美代码
  3. linux上安装java环境
  4. POJ 3241Object Clustering曼哈顿距离最小生成树
  5. 花生葫芦球 健身新运动
  6. stm32看门狗_STM32单片机:独立看门狗、窗口看门狗的配置
  7. 用户授信额度管理中,会运用到哪些策略?
  8. 20200219:不同路径Ⅱ(leetcode63)
  9. 面向模式的软件体系结构
  10. Android ListView示例教程
  11. 【Python】torrentParser1.01
  12. paraview用户指南
  13. php加入到jpg,PHP如何将PNG转换成JPG?
  14. 网站监控服务都包括哪些具体内容?
  15. 美团 O2O 供应链系统架构设计解析
  16. Linux下ffmpeg批量转换图片
  17. 利用FILTER特性优化SQL
  18. 【Lua】【协同程序】【coroutine】知识点详解
  19. 至简设计系列_7段数码管显示
  20. 公众号网课查题-掘光者题库系统

热门文章

  1. .md文件是什么?.md如何打开?怎么打开?
  2. 遥感应用发展观察(更新)
  3. 「史诗级干货」新人up主B站运营炫酷玩法,轻松实现UP!UP!UP!
  4. 在家谱中查找关系远近
  5. Win10(Win7)通过注册表(regedit)添加、修改、删除系统环境变量、或系统服务(services.msc)
  6. [solved] login to server failed: EOF
  7. Tableau雷达图制作——这可能是你能看到最详尽,最清爽,最感人的教程!
  8. 未来计算机网络科技发展趋势,未来计算机网络的发展趋势
  9. ​2021年数模国赛A题国二摘要及经验分享(回忆篇,附部分代码)
  10. 友盟APM和bugly全面对比