看了这篇文章二分图的最大匹配、完美匹配和匈牙利算法 ,对匈牙利算法有了一个初步的认识,文章写得挺好,大概理解了算法原理,又看了很多大佬的题解方法,其实就是不断找增广路,改进匹配,直到找到最大匹配。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { private static Map<Integer, Integer> maxMatch = new HashMap<>(); // 最大匹配 public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = ""; while ((str = reader.readLine()) != null) { final int n = Integer.parseInt(str); final String[] nums = reader.readLine().split(" "); List<Integer> odds = new ArrayList<>(); // 奇数组 List<Integer> evens = new ArrayList<>(); // 偶数组 for (int i = 0; i < n; i++) { final int anInt = Integer.parseInt(nums[i]); if (anInt % 2 == 0) evens.add(anInt); else odds.add(anInt); } int[] matching = new int[evens.size()]; // 记录匹配了偶数的奇数 int count = 0; for (int i = 0; i < odds.size(); i++) { int[] bematched = new int[evens.size()]; // 记录偶数是否被匹配了,0没匹配,1匹配了 if (dfs(evens, odds.get(i), matching, bematched)) count++; } System.out.println(count); // System.out.println(maxMatch); } reader.close(); } /** * @param evens 偶数组 * @param odd 当前奇数 * @param matching 由于找到增广路之后需要沿着路径更新匹配,所以我们需要一个结构来记录路径上的点。 * @param bematched 记录哪个偶数被匹配了 * @return 是否能找到新的偶数和当前奇数配对,即能否找到增广路径 */ public static boolean dfs(List<Integer> evens, int odd, int[] matching, int[] bematched){ for (int i = 0; i < evens.size(); i++) { // 遍历偶数组,与当前奇数相加是否是素数,即能否匹配成功,同时该偶数还没有被匹配过 if (isPrime(evens.get(i) + odd) && bematched[i] == 0){ // 能匹配成功,那这个偶数就要记录下被匹配了 bematched[i] = 1; // 当这个奇数还没有匹配过偶数,这是第一次,那就把这个奇数也记录下来,与当前偶数配对 // 或者这个奇数已经匹配过偶数了,但是还能找到新的偶数和他匹配,那就去找新的偶数,记录在新偶数的名下吧 if (matching[i] == 0 || dfs(evens, matching[i], matching, bematched)){ matching[i] = odd; // maxMatch.put(odd, evens.get(i)); return true; } } } return false; } /** * 判断是否是素数 * @param n * @return */ public static boolean isPrime(int n){ if (n == 1) return false; for (int i = 2; i * i <= n; i++) { if (n % i == 0) return false; } return true; } }