二分图最大匹配

题目:
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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值