题目:
n个人去玩过山车,每个人只能和自己认识的异性朋友坐一起,问最多可以有几对人玩过山车。
输入:
首先输入n和m,n为总人数,m为异性朋友的关系数,之后输入m行,每行输入x和y,表示x和y是一对异性朋友。每个人的编号为1-n之间。
测试输入:
6 5
1 4
1 5
2 5
2 6
3 4
输出:
输出最多可以玩过山车的对数
测试输出:
3
//代码 - 二分图最大匹配 - 匈牙利算法
package Love;
import java.util.*;
public class demo01 {
public static void main(String[] args) {
Test t1 = new Test();
t1.read();
System.out.println(t1.getNum());
}
}
class Test{
private int[][] e = new int[104][104];
private int[] match = new int[104];
private int[] book = new int[104];
private int n, m;
public void read() {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
for(int i = 0; i < 104; i++) {
for(int j = i; j < 104; j++) {
e[i][j] = e[j][i] = 0;
}
}
for(int i = 0; i < m; i++) {
int x = scan.nextInt();
int y = scan.nextInt();
e[x][y] = 1;
e[y][x] = 1;
}
}
public int getNum() {
int cnt = 0;
for(int i = 1; i <= n; i++) {
match[i] = 0;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
book[j] = 0;
}
if(dfs(i)) {
cnt++;
}
}
return cnt;
}
private boolean dfs(int u) {
for(int i = 1; i <= n; i++) {
if(book[i] == 0 && e[u][i] == 1) {
book[i] = 1;
if(match[i] == 0 || dfs(match[i])) {
match[i] = u;
match[u] = i;
return true;
}
}
}
return false;
}
}