ACM HDOJ 2063 (过山车)

该博客详细介绍了ACM竞赛中HDOJ 2063题目的解决方案,主要探讨了如何求解二分图的最大匹配数。文章提供了三种不同的算法实现,包括匈牙利算法的DFS、BFS以及Hopcroft-Carp算法的详细步骤和程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值