匈牙利(二分图最大匹配问题)Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

//把这段代码写下来,为了自己不忘记,以备不时之需。欢迎交流指正(参考博客:https://www.cnblogs.com/javawebsoa/archive/2013/07/18/3198816.html)
public class Main {
    // 因为要用匈牙利算法, 需要先做成2分图, 2分图就是左右可能存在边,而同侧不能存在边,所以分成奇偶
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            ArrayList<Integer> ji = new ArrayList<>();// 存放奇数
            ArrayList<Integer> ou = new ArrayList<>();// 存放偶数
            for (int i = 0; i < n; i++) {
                int x = sc.nextInt();
                if (x % 2 == 0)
                    ou.add(x);
                else
                    ji.add(x);
            }
            int[] used = new int[ou.size()]; //0 说明本次没有用过他“***” 
            int[] alreadyConnect = new int[ou.size()];//alreadyConnect是关键,用来记录已经连好的 边,
            int sum = 0;
            for (int i = 0; i < ji.size(); i++) { //分成二分图,左侧奇 用来大循环
                Arrays.fill(used, 0); //每次要重新置0
                if (find(ji.get(i), ou, used, alreadyConnect))
                    sum++;
            }
            System.out.println(sum);
        }
    }

    private static boolean find(Integer x, ArrayList<Integer> ou, int[] used, int[] alreadyConnect) {
        for (int j = 0; j < ou.size(); j++) { // 扫描每个数
            if (isprim(x + ou.get(j)) && used[j] == 0) {    //满足结合条件,并且左侧的汉子没有被标记(标记的意思是,试图使该汉子休妻娶另一个中意的妹子,但没有成功,所以没必要浪费功夫)
                used[j] = 1;//说明这次 对于i的循环, 此次used[j]=1是用过了
                if (alreadyConnect[j] == 0 || find(alreadyConnect[j], ou, used, alreadyConnect)) {
                // alreadyConnect[j]=0说明该汉子中意的妹子名花无主,  或    试图使j妹子的原配找下一位夫人,如果能够顺利把该妹子给腾出来,
                //那就增加一个左和右相连的边。
                    alreadyConnect[j] = x;
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean isprim(Integer x) {
        int sum = 0;
        for (int i = 2; i <= Math.pow(x, 0.5); i++) {
            if (x % i == 0)
                return false;
        }
        return true;
    }

}
全部评论

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务