题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2063
思路 求二分图的最大匹配数
程序一 匈牙利算法 DFS
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
while (scn.hasNext()) {
int edgesNumber = Integer.parseInt(scn.next());
if (0 == edgesNumber) {
break;
}
int leftSetNumber = Integer.parseInt(scn.next());
int rightSetNumber = Integer.parseInt(scn.next());
Hungary hungary = new Hungary(leftSetNumber, rightSetNumber);
for (int i = 0; i < edgesNumber; ++i) {
int left = Integer.parseInt(scn.next()) - 1;
int right = Integer.parseInt(scn.next()) - 1;
hungary.addEdge(left, right);
}
System.out.println(hungary.maxMatch());
}
scn.close();
}
}
class Hungary {
private int leftSetNumber;
private int rightSetNumber;
private boolean[][] matrix;
private int[] leftResult;
private int[] rightResult;
private boolean[] rightUsed;
private boolean searchPath(int left) {
for (int right = 0; right < rightSetNumber; ++right) {
if (matrix[left][right] && !rightUsed[right]) {
rightUsed[right] = true;
if (-1 == rightResult[right] || searchPath(rightResult[right])) {
rightResult[right] = left;
leftResult[left] = right;
return true;
}
}
}
return false;
}
public Hungary(int leftSetNumber, int rightSetNumber) {
this.leftSetNumber = leftSetNumber;
this.rightSetNumber = rightSetNumber;
matrix = new boolean[leftSetNu