PTA L2 013 紅色警報 25分

2021-10-10 21:38:16 字數 1503 閱讀 9065

傳送門

這道題,並查集。

判斷有多少個連通的區域,其實就是並查集的操作中判斷有多少個根節點。

就是統計根節點的操作cnt。

我們最開始應該儲存每一條連通的邊。

在後面的攻占城市中,我們只需要不處理那些攻占城市連通的邊即可。用vis記錄。

其他的繼續重新使用並查集合並操作,進而統計有多少個根節點sum。

判斷兩個的數量是否相等/相差1(原因是攻占乙個城市之後,那個城市會消失,不算入我們連通性中,但是並查集數根節點的時候會計數,所以是相差1)

因為題目中提到如果本來乙個國家的城市是**成了k個區域,失去乙個城市不影響其他城市的連通性,就不發出警報。而且樣例中的城市2就是這種情況,失去它不影響其他城市的連通性(因為城市2是孤立的個體)

所以會有相等的判斷。

進而確定輸出是什麼。

然後更新我們的cnt,因為題目意思是在上一步操作中有沒有改變連通性,而不是說對於原始的連通性而言。

最後判斷我們的cnt/sum是否為n,如果為n代表所有城市都是孤立的個體,代表全部淪陷。對應輸出即可。

**部分:

#include

#define mst(a, n) memset(a, n, sizeof(a))

using

namespace std;

const

int n =

5e3+10;

const

int m =55;

const

int inf =

1e6+10;

typedef

long

long ll;

struct node

e[n]

;int n, m;

int fa[n]

;int vis[n]

;int

find

(int x)

return fa[x];}

void

merge

(int x,

int y)

}int

main()

for(

int i =

0; i < m; i++

)int cnt =0;

for(

int i =

0; i < n; i++)}

int k;

int sum =0;

cin >> k;

while

(k--

)for

(int i =

0; i < m; i++

)else

} sum =0;

for(

int i =

0; i < n; i++)}

if(sum == cnt +

1|| sum == cnt)

else

cnt = sum;}if

(sum == n)

return0;

}

紅色警報(25分)

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入在第一行給出兩個整數n 0 n 500 和m 5000 分...

紅色警報 25分

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入格式 輸入在第一行給出兩個整數n 0 n 500 和m 5...

L2 013 紅色警報 (25 分)

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入在第一行給出兩個整數n 0 n 500 和m 5000 分...