L2-025 分而治之 - java

L2-025 分而治之


时间限制
600 ms
内存限制
64 MB


题目描述:
分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。

输入格式:
输入在第一行给出两个正整数 N 和 M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 到 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K 行方案,每行按以下格式给出:

Np v[1] v[2] … v[Np]
其中 Np 是该方案中计划攻下的城市数量,后面的系列 v[i] 是计划攻下的城市编号。

输出格式:
对每一套方案,如果可行就输出YES,否则输出NO。


给定一个无向图,再给你k组进攻路线,判断这k组进攻路线是否可行


emmmmmmm

暴力判断即可

首先如何判断当前城市是否孤立无援呢
也就是当前城市没被攻击,且相邻城市都被攻击了,这样子该城市就是孤立无援的城市

最后就是用无向图存储,for循环暴力去判断当前方案是否可行即可


import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	static int N = (int) 1e4;
	static ArrayList<Integer> map[] = new ArrayList[N + 10]; // 存储城市
	static boolean vis[] = new boolean[N + 10]; // 标记当前城市是否被攻击
	static int n, m;

	static boolean check()
	{
		for (int i = 1; i <= n; i++)
		{
			for (int j = 0; j < map[i].size(); j++)
			{
//				当前城市没有被攻击且相邻国家也没有被攻击
				if (!vis[i] && !vis[map[i].get(j)])
					return false;
			}
		}
		return true;
	}

	public static void main(String[] args) throws IOException
	{
		n = ini();
		m = ini();
		for (int i = 1; i <= n; i++)
			map[i] = new ArrayList<Integer>();

		while (m-- > 0)
		{
			int a = ini(), b = ini();
			map[a].add(b);
			map[b].add(a);
		}

		int k = ini();
		while (k-- > 0)
		{
			int np = ini();
			vis = new boolean[n + 10];
			while (np-- > 0)
			{
				int v = ini();
				vis[v] = true; // 当前城市被攻打了
			}
			out.println(check() ? "YES" : "NO");
		}

		out.flush();
		out.close();

	}

	static StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static PrintWriter out = new PrintWriter(System.out);

	static int ini() throws IOException
	{
		sc.nextToken();
		return (int) sc.nval;
	}

}

ArrayList
ArrayList


如果有说错的 或者 不懂的 尽管提 嘻嘻

一起进步!!!


闪现

你可能感兴趣的:(pta,算法,java)