【CCCC】L2-013 紅色警報 (25分),,並查集計算集合個數
problem
L2-013 紅色警報 (25分)
戰爭中保持各個城市間的連通性非常重要。本題要求你編寫一個報警程式,當失去一個城市導致國家被分裂為多個無法連通的區域時,就發出紅色警報。注意:若該國本來就不完全連通,是分裂的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 4
0 1
1 3
3 0
0 4
5
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.
作者
陳越
單位
浙江大學
程式碼長度限制
16 KB
時間限制
400 ms
記憶體限制
64 MB
- n個點m條邊的圖,隨後按順序割掉k個點,每次判斷剩餘圖的連通性
solution
- 連通性,很容易想到並查集
- 每攻打一次城市重新跑一次並查集(不合並已經被攻打的點),如果當前集合個數與上一張圖的集合數相等或者+1則無影響,否則紅色警告。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5050;
int x[maxn], y[maxn], vis[maxn];
int fa[maxn];
void init(int n){for(int i = 0; i < n; i++)fa[i]=i;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x, int y){x=find(x);y=find(y);if(x!=y)fa[x]=y;}
int count(int n){//統計並查集集合個數
int cnt = 0;
for(int i = 0; i < n; i++)//節點從0-n編號
if(fa[i]==i)cnt++;
return cnt;
}
int main(){
int n, m;
cin>>n>>m;
init(n);
for(int i = 1; i <= m; i++){
cin>>x[i]>>y[i];
merge(x[i],y[i]);
}
int k; cin>>k;
int cc1=count(n), cc2;
for(int i = 1; i <= k; i++){
int t; cin>>t;
vis[t] = 1;//被攻佔的不再聯通
init(n);
for(int j = 1; j <= m; j++){
if(vis[x[j]]||vis[y[j]])continue;
merge(x[j],y[j]);
}
cc2 = count(n);
//cout<<cc2<<endl;
if(cc2==cc1||cc2==cc1+1)
printf("City %d is lost.\n",t);
else
printf("Red Alert: City %d is lost!\n",t);
cc1 = cc2;
}
if(k==n)printf("Game Over.\n");
return 0;
}
相關文章
- L2-013 紅色警報【並查集】並查集
- L2-013 紅色警報 (25 分)(並查集)並查集
- 並查集 - 紅色警報 - 天梯賽 L2-013並查集
- L2-013 紅色警報
- IT技術員職業生涯的紅色警報
- 紅色警報 ORACLE RAC 11.2.0.4 FOR SOLARIS 10 ASM 和DB因叢集心跳丟失重啟OracleASM
- 並查集合集並查集
- 並查集到帶權並查集並查集
- POJ 1611-The Suspects(並查集-同一集合)並查集
- 使用並查集處理集合的合併和查詢問題並查集
- NET 集合交集、並集、差集操作
- OpenMP並行化例項----Mandelbrot集合並行化計算並行
- 【並查集】【帶偏移的並查集】食物鏈並查集
- HDU 3938 Portal【並查集+upper_bound(第四個引數)】並查集
- 【資料集合】並集、交集、差集、子集
- 並查集(一)並查集的幾種實現並查集
- 3.1並查集並查集
- 並查集(小白)並查集
- Prometheus時序資料庫-報警的計算Prometheus資料庫
- (safedisc 2) 紅色警報2破軟體防拷貝部分分析 (30千字)
- 一個慢查詢報警的簡單處理
- 修改陣列【並查集維護集合的最大值、連續數字的最大值】陣列並查集
- 轉載:一個python並查集類Python並查集
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 食物鏈(並查集)並查集
- python-進階教程-對兩個集合/字典求交集、差集、並集Python
- 紅色警戒開啟黑屏如何解決 window10開啟紅警黑屏怎麼辦
- 並查集(二)並查集的演算法應用案例上並查集演算法
- Python實現求多個集合之間並集的方法Python
- 如何從字串文字中拆解出多個數值並計算字串