原题链接:连通图
解题思路:
用邻接矩阵存储每个顶点的出度(就是每个点到其它点有几个),bfs遍历每行,将每个点加入队列,再来个判断,判断每个点是否都走过
注意事项:
参考代码:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * 泸州职业技术学院 * @BelongsProject Demo * @BelongsPackage PACKAGE_NAME * @Author lgb * @CreateTime 2022-06-08 21:21 * @Description TODO 图,最重要的就是存储和遍历,这里用邻接矩阵存储,这里是无向图,bfs遍历 * @Version 1.0 * 思考:根据第一行输入判断下面会有多少行数据,当输入0结束 * 这里的bfs不是走迷宫一样,上下左右,而是一行一行的遍历,判断所有顶点是否走过,连通性 */ public class BFS_1732_连通图 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //顶点 和边 int m = scanner.nextInt(); int n = scanner.nextInt(); while (m != 0) { //邻接矩阵存放数据 int[][] mm = new int[m][m]; //用于判断是否每个顶点是否都走了。 boolean[] bool = new boolean[m]; //边 for (int i = 0; i < n; i++) { int y = scanner.nextInt()-1; int x = scanner.nextInt()-1; //存放边 就是两个点互联,无向图 mm[y][x] = 1; mm[x][y] = 1; } //一行的进行遍历,看看所有点是否都能走通(不是两个点必须联通,而是有路径可以走通) bfs(bool, mm); //下一组数据 m = scanner.nextInt(); n = scanner.nextInt(); } //结束 scanner.close(); } public static void bfs(boolean[] bool, int[][] mm) { //创建队列 Queue queue = new LinkedList(); //初始化 queue.add(0);//从第一行开始遍历 bool[0] = true;//标记第一个顶点已走 while (queue.size() != 0) { int n = queue.size(); //每次都要遍历完上次的队列 while (n > 0) { n--; //取出一个顶点 int q = queue.poll(); //遍历每一行 for (int i=0; i<bool.length; i++) { if (mm[q][i] == 1 && !bool[i] ) { //下个顶点加入队列 queue.add(i); //标记顶点已走 bool[i] = true; } } } } //标记 boolean flag = false; for (boolean b : bool) { if (!b) { flag = true; break; } } if (flag) { System.out.println("NO"); } else { System.out.println("YES"); } } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复