package day0313;
import java.util.Scanner;
public class L2_013红色警报 {
static int N,M,K ;
static int[][] Maps;//统计初始联通数量
static int[] f;//重置根节点数组
static int[] falg;//判断城市是否被攻占
public static void init() {
for (int i = 0; i < f.length; i++) {
f[i] = i;
}
}
public static int find(int x) {
if(x!=f[x]) {
f[x] = find(f[x]);
}
return f[x];
}
public static void unite(int a,int b) {
int x = find(a);
int y = find(b);
if(x!=y) f[x] = y;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int M = scan.nextInt();
Maps = new int[M][2];
f = new int[N];
falg = new int[N];
init();
for (int i = 0; i < M; i++) {
Maps[i][0] = scan.nextInt();
Maps[i][1] = scan.nextInt();
unite(Maps[i][0],Maps[i][1]);
}
int count = 0;//统计攻占前的联通城市数量
for (int i = 0; i < f.length; i++) {
if(f[i]==i) {
count++;
}
}
K = scan.nextInt();
int n = K;
while(K-->0) {
init();
int k = scan.nextInt();
falg[k] = 1;
for (int i = 0; i < M; i++) {
int a = Maps[i][0];
int b = Maps[i][1];
if(falg[a]==1 || falg[b]==1)continue;
if(k!=a&&k!=b)unite(a, b);
}
int sum = 0;
for (int i = 0; i < N; i++) {
if(f[i]==i)sum++;
}
//因为删掉该城市 这个城市也是一个单独的连通块 所以当前连通块>之前连通块+这个城市 说明删掉该城市 会改变图的连通性
if(sum>count+1) System.out.printf("Red Alert: City %d is lost!\n",k);
else System.out.printf("City %d is lost.\n",k);
count=sum;//更新连通块
}
if(N==n)System.out.printf("Game Over.");
}
}
L2_013红色警戒
最新推荐文章于 2025-03-04 11:22:00 发布