L2-013 紅色警報 (25 分)(並查集)
【解題思路】
每一次都要重新判斷一下需要連線的道路變化有無影響
有影響的情況比較難找,那就直接先判斷沒有影響的情況
就是等於前集合數目等於現集合數目或原集合數目+1等於現集合數目(因為題意,若該國本來就不完全連通,是分裂的k個區域,而失去一個城市並不改變其他城市之間的連通性,則不要發出警報)
這樣即使去掉當前結點也無礙
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 5020
int father[maxn];
int vis[maxn];
struct node {
int x,y;
}Node[maxn];
void init()
{
for(int i=0;i<maxn;i++)
{
father[i]=i;
}
}
/*int findFather(int x)
{
while (x!=father[x])
{
x=father[x];
}
return x;
}*/
int findFather(int x)
{
return x==father[x]?father[x]:findFather(father[x]);
}
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
father[faA]=faB;
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m))
{
init();
memset(vis, 0, sizeof(vis));
for(int i=0;i<m;i++)
{
scanf("%d%d",&Node[i].x,&Node[i].y);
Union(Node[i].x, Node[i].y);
}
int num=0;
for(int i=0;i<n;i++)
{
if(father[i]==i)
num++;
}
int k;
scanf("%d",&k);
int num1=0;
while (k--)
{
for(int i=0;i<n;i++)
{
father[i]=i;//之前攻佔之後的連通情況發生改變,要進行初始化
}
num1=0;
int h;
scanf("%d",&h);
vis[h]=1;
for(int i=0;i<m;i++)
{
if(vis[Node[i].x]==0&&vis[Node[i].y]==0)
Union(Node[i].x, Node[i].y);
}
for(int i=0;i<n;i++)
{
if(father[i]==i)
num1++;
}
if(num1==num||(num+1==num1))//不改變其他城市的連通性
printf("City %d is lost.\n",h);
else
printf("Red Alert: City %d is lost!\n",h);
num=num1;
}
num=0;
for(int i=0;i<n;i++)
{
if(vis[i]==1)
num++;
}
if(num==n)
printf("Game Over.\n");
}
return 0;
}
相關文章
- L2-013 紅色警報【並查集】並查集
- 【CCCC】L2-013 紅色警報 (25分),,並查集計算集合個數並查集
- 並查集 - 紅色警報 - 天梯賽 L2-013並查集
- L2-013 紅色警報
- 天梯賽L2-013 紅色警報 (三種方法)
- 紅色警報 ORACLE RAC 11.2.0.4 FOR SOLARIS 10 ASM 和DB因叢集心跳丟失重啟OracleASM
- 並查集到帶權並查集並查集
- 關押罪犯 擴充套件域並查集 帶權並查集 二分圖+二分套件並查集
- 查並集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集(一)並查集的幾種實現並查集
- 並查集(小白)並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- 3.1並查集並查集
- 並查集應用並查集
- 寫模板, 並查集。並查集
- 並查集的使用並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 淺談並查集並查集
- 食物鏈(並查集)並查集
- 並查集(Union Find)並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- Codeforces2020D Connect the Dots(觀察 + 並查集 + 差分)並查集
- 並查集題目合集並查集
- 並查集深度應用並查集
- 並查集java實現並查集Java
- 【轉】種類並查集並查集
- The Suspects-並查集(4)並查集
- 並查集擴充套件並查集套件
- (Day3)並查集並查集
- 並查集演算法並查集演算法
- 並查集-Java實現並查集Java
- 紅色警戒開啟黑屏如何解決 window10開啟紅警黑屏怎麼辦