解決聯通塊問題的一般方法

2021-10-10 12:37:51 字數 1950 閱讀 1486

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被**為多個無法連通的區域時,就發出紅色警報。注意:若該國本來就不完全連通,是**的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。

輸入格式:

輸入在第一行給出兩個整數n(0 < n ≤ 500)和m(≤ 5000),分別為城市個數(於是預設城市從0到n-1編號)和連線兩城市的通路條數。隨後m行,每行給出一條通路所連線的兩個城市的編號,其間以1個空格分隔。在城市資訊之後給出被攻占的資訊,即乙個正整數k和隨後的k個被攻占的城市的編號。

注意:輸入保證給出的被攻占的城市編號都是合法的且無重複,但並不保證給出的通路沒有重複。

輸出格式:

對每個被攻占的城市,如果它會改變整個國家的連通性,則輸出red alert: city k is lost!,其中k是該城市的編號;否則只輸出city k is lost.即可。如果該國失去了最後乙個城市,則增加一行輸出game over.。

輸入樣例:

5 40 1

1 33 0

0 45

1 2 0 4 3

輸出樣例:

city 1 is lost.

city 2 is lost.

red alert: city 0 is lost!

city 4 is lost.

city 3 is lost.

game over.

讀完題目可以發現是乙個聯通塊的問題,這種問題有兩種解法,一種是使用並查集維護聯通塊,另一種就是使用深搜搜尋聯通塊。這裡只有並查集解決的版本,之後有時間會更新dfs的版本。

我們的目的是判斷少了某乙個點會不會使原先的聯通塊**,那麼我們就可以根據原先的聯通塊個數和將乙個點去除以後的聯通塊個數進行比較,如果除去以後的聯通塊個數比原先的增加了,那麼說明這個點會使原先的聯通塊**,否則則不會。

這裡有乙個判斷並查集中聯通塊個數的方法:遍歷一遍pre陣列,如果pre【i】等於 i 的話,說明這個點是某個集合的根節點。所以我們只需要找到有多少個pre【i】等於 i 的點就說明有多少個聯通塊。

ac**:

#include

#define endl '\n'

#define inf 0x3f3f3f3f

#define ll long long

using

namespace std;

const

int n =

1e5+10;

int p[n]

, bj[n]

, n, m;

vector<

int> t[n]

;void

init()

intfind

(int root)

return root;

}void

unit

(int a,

int b)

void

solve()

for(

int i =

0; i < n; i ++

)int k;

cin >> k;

for(

int o =

0; o < k; o ++)}

}}for(

int j =

0; j < n; j ++)if

(tem > sum)

printf

("red alert: city %d is lost!\n"

, num)

;else

printf

("city %d is lost.\n"

, num);if

(tem ==0)

printf

("game over.");

sum = tem;

//每次更新當前的聯通塊個數}}

intmain()

一般性問題的解決方法

step1 調研 調研即乙個專案或者課題的 是需要通過大量的調研獲取資料,研究現狀,問題實際等第一手資料。調研一般會由1天至百年之久,你要調查乙個商品 只需要1天,調查乙個商品的 波動需要1個月,乙個商品的供需則需要一年。最長的估計就是環境類或者宇宙類的問題了,也許等待百年才會發現一顆新星。step...

出棧順序問題的一般解決方法

設有乙個棧為s 設有一佇列q,q儲存了要求的s中元素出棧的順序 設有一佇列q push,其中儲存了元素的入棧順序 判斷棧頂元素是否可以出棧,若為空,或者不為空但是棧頂元素不是q中當前資料,則不可以出棧.否則可以出棧 若棧頂元素可以出棧,則將其進行出棧,並將q隊首元素出隊 若棧頂元素不可以出棧,則在佇...

開機黑屏的一般解決方法

一 如果沒有電力 檢查pc電源電源介面和電源線通電情況 1.檢查機箱電源的介面和電源線,是否完好。如果介面和電源線有破損斷裂的應當及時更換。2.檢查主機板電源線插口。如果沒有破損,就將插口拔出再插入。一般可以解決,由於主機板接觸不良導致沒有電的情況。3檢查機箱電源 情況,我們一般都是利用替代法進行檢...