L2-013 紅色警報【並查集】
L2-013 紅色警報
https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208
題目
戰爭中保持各個城市間的連通性非常重要。本題要求你編寫一個報警程式,當失去一個城市導致國家被分裂為多個無法連通的區域時,就發出紅色警報。注意:若該國本來就不完全連通,是分裂的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.
分析
並查集的使用。
C++程式
#include<iostream>
#include<vector>
using namespace std;
const int N=510;
int pre[N];
bool flag[N];
//初始化
void init(int n)
{
for(int i=0;i<=n;i++)
pre[i]=i;
}
//查詢函式,查詢x的祖先結點
int find(int x)
{
int r=x;
while(r!=pre[r]) r=pre[r];
//路徑壓縮
while(x!=r)
{
int i=pre[x];
pre[x]=r;
x=i;
}
return r;
}
//將x和y結點連線在一起
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
//計算連通度
int degree(int n)
{
int cnt=0;
for(int i=0;i<n;i++)
if(!flag[i]&&i==find(i))
cnt++;
return cnt;
}
//邊
int edge[5100][2];
vector<int>v;
int main()
{
int n,m,k;
scanf("%d%d",&n,&m);
init(n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&edge[i][0],&edge[i][1]);
join(edge[i][0],edge[i][1]);
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
int x;
scanf("%d",&x);
v.push_back(x);
}
int count=degree(n);
int num=n;
for(int i=0;i<k;i++)
{
init(n);
flag[v[i]]=true;
for(int j=0;j<m;j++)
{
//如果邊的某個端點是要被去掉的點,就跳過
if(flag[edge[j][0]]||flag[edge[j][1]]) continue;
join(edge[j][0],edge[j][1]);//否則新增邊
}
int count2=degree(n);
if(count2>count)//如果連通度變大了
{
printf("Red Alert: City %d is lost!\n",v[i]);
count=count2;
}
else//如果連通度沒變
printf("City %d is lost.\n",v[i]);
if(count!=count2) count=count2;
if(--num<=0) printf("Game Over.\n");//如果刪除的結點到達了總數
}
return 0;
}
相關文章
- L2-013 紅色警報 (25 分)(並查集)並查集
- 並查集 - 紅色警報 - 天梯賽 L2-013並查集
- 【CCCC】L2-013 紅色警報 (25分),,並查集計算集合個數並查集
- L2-013 紅色警報
- IT技術員職業生涯的紅色警報
- 紅色警報 ORACLE RAC 11.2.0.4 FOR SOLARIS 10 ASM 和DB因叢集心跳丟失重啟OracleASM
- 並查集到帶權並查集並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集(一)並查集的幾種實現並查集
- 3.1並查集並查集
- 並查集(小白)並查集
- (safedisc 2) 紅色警報2破軟體防拷貝部分分析 (30千字)
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 食物鏈(並查集)並查集
- 紅色警戒開啟黑屏如何解決 window10開啟紅警黑屏怎麼辦
- 並查集(二)並查集的演算法應用案例上並查集演算法
- The Suspects-並查集(4)並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- 並查集演算法並查集演算法
- 並查集深度應用並查集
- 【轉】種類並查集並查集
- 並查集java實現並查集Java
- 並查集-Java實現並查集Java
- 並查集題目合集並查集
- 並查集以及應用並查集
- 並查集的應用並查集
- 暢通工程(並查集)並查集
- (Day3)並查集並查集