bfs/dfs的应用--countComponents

来源:互联网 发布:点位图软件 brd 编辑:程序博客网 时间:2024/04/30 22:15

题目

你是自己所在州交通部门的首席技术专家。有许多城市通过公路网络连通,即交通可以沿任一方向流动。一些“城市组”可能会与其他断开,形成集群。

一个集群是一组彼此间连通且与其他部分相断开的城市组。假设一条路最多可连接两个给定的城市。给定这样一个城市和公路网络,求内部连通城市集群总数。

类Count_Components的方法countComponents的输入包括一个二维网络,且在第i个城市到第j个城市连通时,输入条目为(i,j)为1,否则为0。

该方法应返回一个表示连通分支总数的整数。grid只包含0和1.


代码

import java.util.ArrayDeque;//给定一个无向图的邻接矩阵,只有1和0,1表示关联//统计其中的连通分量个数public class Count_Components {public static int countComponents_dfs(int grid[][]) {int count = 0;if (grid == null || grid.length == 0 || grid[0].length == 0 || grid.length != grid[0].length) {return count;}int nodes = grid.length;boolean visited[] = new boolean[nodes];for (int i = 0; i < visited.length; i++) {if (visited[i] == false) {dfsComponent(grid, i, visited);count++;}}return count;}// ******************************************************************************private static void dfsComponent(int[][] grid, int i, boolean[] visited) {visited[i] = true;for (int j = 0; j < visited.length; j++) {if (grid[i][j] == 1 && visited[j] == false) {dfsComponent(grid, j, visited);}}}private static int countComponents_bfs(int[][] grid) {int count = 0;if (grid == null || grid.length == 0 || grid[0].length == 0 || grid.length != grid[0].length) {return count;}int nodes = grid.length;boolean visited[] = new boolean[nodes];ArrayDeque<Integer> nodeQueue = new ArrayDeque<>();int curNode = 0;for (int i = 0; i < visited.length; i++) {if (visited[i] == false) {nodeQueue.offer(i);visited[i] = true;while (!nodeQueue.isEmpty()) {curNode = nodeQueue.poll();for (int j = 0; j < visited.length; j++) {if (grid[curNode][j] == 1 && visited[j] == false) {visited[j] = true;nodeQueue.offer(j);}}}count++;}}return count;}public static void main(String[] args) {int grid1[][] = new int[4][4];System.out.println(grid1.length + "行" + grid1[0].length + "列");for (int i = 0; i < grid1.length; i++) {for (int j = 0; j < grid1[0].length; j++) {grid1[i][j] = 1;}}System.out.println(countComponents_dfs(grid1));System.out.println(countComponents_bfs(grid1));int grid2[][] = new int[4][4];System.out.println(grid2.length + "行" + grid2[0].length + "列");for (int i = 0; i < grid2.length; i++) {for (int j = 0; j < grid2[0].length; j++) {if (i == j) {grid2[i][j] = 1;}}}System.out.println(countComponents_dfs(grid2));System.out.println(countComponents_bfs(grid2));int grid3[][] = new int[5][5];System.out.println(grid3.length + "行" + grid3[0].length + "列");grid3[1][1] = 1;grid3[1][2] = grid3[2][1] = 1;grid3[2][2] = 1;grid3[2][3] = grid3[3][2] = 1;grid3[4][3] = grid3[3][4] = 1;System.out.println(countComponents_dfs(grid3));System.out.println(countComponents_bfs(grid3));}}


输出

4行4列114行4列445行5列22


0 0