对于算法题:分而治之。这种要怎么写?

分而治之,各个击破是兵家常用的策略之一。在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破。为此参谋部提供了若干打击方案。本题就请你编写程序,判断每个方案的可行性。
输入格式
输入在第一行给出两个正整数 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








