时间限制
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;
}
}
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!