对于算法题:分而治之。这种要怎么写?
分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。
输入格式
输入在第一行给出两个正整数 N 和 M(均不超过10 000),分别为敌方城市个数(于是默认城市从 1 到 N 编号)和连接两城市的通路条数。随后 M 行,每行给出一条通路所连接的两个城市的编号,其间以一个空格分隔。在城市信息之后给出参谋部的系列方案,即一个正整数 K (≤ 100)和随后的 K 行方案,每行按以下格式给出:
Np v[1] v[2] ... v[Np]
其中 Np 是该方案中计划攻下的城市数量,后面的系列 v[i] 是计划攻下的城市编号。
回答:
用一个map(HashMap<Integer, LinkedList>)存储与每座城市相通的城市,一个map(代码中sizeMap)存储与每座城市相通的城市数。每毁灭一座城市就将该城市相邻的城市数变为0,并且将之前与其相邻的城市的相邻城市数减一。最后通过遍历这个map判断是否每座城市相通的城市数都为0。当然,每判断一次map都要还原,所以要一个数组用来还原sizemap。
import java.util.HashMap;import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class hw03_1 {
//超时
//C++可通过
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
HashMap<Integer, LinkedList> map = new HashMap<>();
HashMap<Integer, Integer> sizeMap = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(i + 1, new LinkedList());
sizeMap.put(i + 1, 0);
}
int a, b;
for (int i = 0; i < m; i++) {
a = scanner.nextInt();
b = scanner.nextInt();
map.get(a).add(b);
map.get(b).add(a);
sizeMap.put(a, sizeMap.get(a) + 1);
sizeMap.put(b, sizeMap.get(b) + 1);
}
int[] ints = new int[sizeMap.size()];
for (int i = 0; i < sizeMap.size(); i++) {
ints[i] = sizeMap.get(i + 1);
}
int k = scanner.nextInt();
for (int i = 0; i < k; i++) {
int index = scanner.nextInt();
for (int j = 0; j < index; j++) {
int cc = scanner.nextInt();
sizeMap.put(cc, 0);
for (int f = 0; f< n; f++) {
if (map.get(f + 1).contains(cc)) {
sizeMap.put(f + 1, sizeMap.get(f + 1) - 1);
}
}
}
if (isSuccess(sizeMap)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
for (int j = 0; j < ints.length; j++) {
sizeMap.put(j + 1, ints[j]);
}
}
}
public static boolean isSuccess(HashMap<Integer, Integer> sizeMap) {
for (int i = 0; i < sizeMap.size(); i++) {
if (sizeMap.get(i + 1) > 0) {
return false;
}
}
return true;
}
}
以上是 对于算法题:分而治之。这种要怎么写? 的全部内容, 来源链接: utcz.com/p/944336.html