L2_013红色警戒

本文介绍了一个使用Java编写的程序,模拟城市连通性变化,当某个城市被攻占时判断是否会导致连通块减少,输出红色警报或城市丢失。
摘要由CSDN通过智能技术生成
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.");
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值