匈牙利算法

匈牙利算法

A公司和B公司有n个合作的子项目,每个子项目由A公司和B公司各一名员工参与。一名员工可以参与多个子项目。
一个员工如果担任了该项目的项目经理,它需要对所参与的该项目负责。一个员工也可以负责多个项目。
A公司和B公司需要保证所有子项目都能有人负责,问最少需要指定几名项目经理?----网易校招笔试题
Solution:
此问题属于二分图中最小点覆盖(或者最大匹配边数)的问题



import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int[] A = getArr(s.nextLine().trim());
        int[] B = getArr(s.nextLine().trim());
        int n = Integer.parseInt(s.nextLine().trim());
        int[] p = new int[10000];
        int[][] map = new int[10000][10000];
        for(int i = 0; i < n; i++) {
            int[]tmp = getArr(s.nextLine().trim());
            map[tmp[0]][tmp[1]] = 1;
        }
        Arrays.fill(p, - 1);
        boolean[] visit = new boolean[10000];
        int cnt = 0;
        for(int i: A) {
            Arrays.fill(visit, false);
            if(match(i, map, visit, B, p)) {
                cnt++;
            }
        }
        System.out.println(cnt);
    }
    public static int[] getArr(String str) {
        String[] arr = str.split(" ");
        int[] res = new int[arr.length];
        for(int i = 0; i < arr.length; i++) {
            res[i] = Integer.parseInt(arr[i]);
        }
        return res;
    }
    public static boolean match(int i, int[][] map, boolean[] visit, int[] B, int[] p) {
        for (int j = 0; j < B.length ; j++) {
            if(map[i][B[j]] != 0 && !visit[B[j]]) {
                visit[B[j]] = true;
                if(p[B[j]] == -1 || match(p[B[j]], map, visit, B, p)) {
                    p[B[j]] = i;
                    return true;
                }
            }
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值