1. 程式人生 > 實用技巧 >筆試題目-無向圖是否全連通

筆試題目-無向圖是否全連通

筆試中遇到的題:

  給你 N 個小島,求這 N 個小島是否是連通的,比如:小島 1 與 2 連通,1 與 3 連通,則 1、2、3 這三個小島都是連通的。

  給定一個無向圖的鄰接矩陣,其中 0 表示不可達,1表示可以到達。

思路:

  利用無向圖的鄰接矩陣,通過遞迴遍歷即可,統計已經連通的小島個數 islandConnectedCount,當個數為 N 時,則表示 N 個小島都連通了,返回 true ;否則,當遍歷完整個矩陣後,還是islandConnectedCount != N ,表示 N 個小島沒有全部連通,返回 false.

public class GraphConnected {
    
private static int islandConnectedCount = 0; public static void main(String[] args) { int[][] map = new int[][]{ {0,1,0,0,0,1}, {1,0,1,1,0,0}, {0,1,0,0,1,0}, {0,1,0,0,1,0}, {0,0,1,1,0,0}, {1,0,0,0,0,0} }; //無向圖的鄰接矩陣
boolean[] flag = new boolean[map.length]; flag[0] = true; //初始第 0 座小島可達 islandConnectedCount = 1; System.out.println(isConnected(map, flag,0)); //從編號為 0 的小島開始遍歷 } public static boolean isConnected(int[][] map, boolean[] flag,int curNumber){ //map為鄰接矩陣;flag為標記此小島是否已連通;curNumber為當前的小島編號
if(islandConnectedCount == map.length) return true; //已經連通的小島個數 for(int i = 0; i < map.length; i++){ if(map[curNumber][i] == 0 || flag[i] == true){ continue; // 當前小島與第 i 個小島沒有路,或者已經遍歷過了,則跳過 }else { flag[i] = true; // 設定第 i 座小島為可到達 islandConnectedCount++; boolean res = isConnected(map,flag,i); if(res == true) return true; } } return false; } }