USACO 1359 城堡(並查集)

2021-10-11 18:32:41 字數 1865 閱讀 6113

acwing**原題通道

題意分析:

這道題難度並不大,只要熟練使用並查集即可。給我們一張地圖,#代表牆壁,我們用1表示西牆,2表示北牆,4表示東牆,8表示南牆,將沒有牆壁隔開的連通的方塊記為乙個房間,題目共有四問:房間的總數,最大的房間的面積,打掉一堵牆可以得到的最大的房間的面積,打掉的這堵牆在**。

這道題可以使用並查集floodfill來做,這裡講解一下使用並查集的做法。(假如並查集的基礎知識不太了解,可以先事先了解一下並查集的基礎使用。)

我們可以從城堡左上角開始逐行列舉,每次列舉北邊和東邊兩個方向,就可以不漏的列舉出來所有的牆,假設列舉到的位置的數p=9,我們需要列舉他東邊的牆,我們只需要讓p & 4判斷是否是1,若是1則證明東邊有牆。當列舉到的方向沒有牆的話,我們就是用並查集將這兩個方塊加入到乙個連通塊中,初始cnt=n*m,也就是開始的時候有n*m個房間,我們連通一次,少乙個房間,最後cnt就是房間的個數。

如圖,共有五個房間:

;// p:並查集 sz:連通塊的面積

int g[n]

[n];

// 並查集合並

intfind

(int x)

intmain()

, dy[2]

=, dw[2]

=;for(

int i =

0; i< n; i++

)for

(int j =

0; j < m; j++

)for

(int u =

0; u <

2; u++)if

(!(g[i]

[j]& dw[u]))

// 如果對應方向沒有牆

}

cout << cnt << endl << max_area << endl;

max_area =0;

int rx , ry , rw;

// 從西到東 從南到北

for(

int j =

0; j < m; j++

)for

(int i = n-

1; i >=

0; i--

)for

(int u =

0; u <

2; u++)if

(g[i]

[j]& dw[u]

)// 如果有牆}}

cout << max_area << endl;

cout << rx +

1<<

' '<< ry +

1<<

' '<<

(rw ==2?

'n':

'e')

<< endl;

return0;

}

並查集 小鑫的城堡

time limit 1000ms memory limit 65536k 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的...

小鑫的城堡(並查集)

time limit 1000ms memory limit 65536k 有疑問?點這裡 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的...

並查集 小鑫的城堡

time limit 1000ms memory limit 65536k 從前有乙個國王,他叫小鑫。有一天,他想建一座城堡,於是,設計師給他設計了好多簡易圖紙,主要是房間的連通的圖紙。小鑫希望任意兩個房間有且僅有一條路徑可以相通。小鑫現在把設計圖給你,讓你幫忙判斷設計圖是否符合他的想法。比如下面的...