傳送門
這道題,並查集。
判斷有多少個連通的區域,其實就是並查集的操作中判斷有多少個根節點。
就是統計根節點的操作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 分...