並查集的應用(島問題)

2021-10-01 11:59:39 字數 1361 閱讀 6934

題意描述

乙個矩陣中只有0和1兩種值,每個位置都可以和自己的上、下、左、右四個位置相連,如果有一片1連在一起,這個部分叫做乙個島,求乙個矩陣中有多少個島?

舉例:1,1,0,1

1,0,1,0

0,1,1,1

共有三個島。

解決方案

常規解法

我們可以設計乙個感染函式,該函式的功能是如果當前位置是1,那麼會將該位置的值修改為2,並且對上下左右遞迴呼叫。

示例**

#include

#include

using

namespace std;

void

infect

(vectorint>>

&arr,

int row,

int col,

int rows,

int cols)

arr[row]

[col]=2

;infect

(arr, row, col +

1, rows, cols)

;infect

(arr, row, col -

1, rows, cols)

;infect

(arr, row +

1, col, rows, cols)

;infect

(arr, row -

1, col, rows, cols);}

intcountislands

(vectorint>>

&arr)}}

return res;

}int

main

(int argc,

char

** ar**),,

};int res =

countislands

(arr)

; cout << res << endl;

system

("pause");

return exit_success;

}

並行處理解決方案

如果我告訴你這個矩陣超大,多cpu、多工怎麼搞?

我們可以分塊,分別計算各個區域中島的數量,然後合併,但是在我們合併的時候又總是存在一些問題,即當邊界兩邊都是1,我們怎麼對待島的數量的問題,使用並查集可以十分方便的解決這乙個問題,因為並查集可以十分方便的合併兩個集合以及判斷兩個元素是否是同乙個集合的。具體如下

如果兩邊都是1,那麼我們看看他們是否是同乙個集合,如果不是那麼就將其合併成乙個集合,如果是乙個集合,那麼直接將島的數量減一,如果一邊是0一邊是1,那麼跳過。

並查集的應用

特點 1,都有乙個陣列儲存它的根節點 2,用vis陣列儲存其是否訪問過 3,如果cnt 1 說明該圖是連通的。連通圖中只有根節點的父節點是自身,cnt應該是1 解決的題目 1,題目已經給了圖上頂點之間的關係,通過頂點之間的關係,求連通分量的個數 include stdio.h int bin 100...

並查集的應用

並查集可以有很多應用。比如權值並查集或帶擴充套件域的並查集,可以來維護一些可傳遞的關係。當然,並查集最直接的應用,則是來維護集合的的連通關係。第一題題意 給出一幅圖,以及一系列操作,每次操作刪去乙個點,及這個點相關的所有邊,並輸出刪點之後的連通塊個數。思路 這道題把過程倒著來就好了,可以看成建圖的過...

並查集問題

輸入 第一行 城鎮數目n,道路數目m 接下的每一行表示 某條道路連線的城鎮號 輸出 至少還需要建設的道路數目,才能將所有的城鎮連線起來 例子 輸入 3 31 2 1 22 1 輸出 1解釋 要使城鎮123連通,還需要修建23之間的連通路 即還需要修建一條路 cpp實現問題求解 include usi...