洛谷 P1640 [SCOI2010] 连续攻击游戏题解

CodingGoat / 2024-10-15 / 原文

注意到值域是 \([1,10000]\),所以我们可以将武器攻击值放在左部,武器编号放在右部,那么就是一个二分图。那么答案就是从 \(1\) 开始枚举左部的点直至无法匹配为止。时间复杂度 \(O(Vn)\),其中 \(V\) 是值域。但是由于一次修改最多修改 \(O(V)\) 个点的匹配,所以根本跑不满。

bool dfs(int now) {
	for(auto v:G[now]) {
		if(!vis[v]) {
			vis[v]=1;
			if(!to[v]||dfs(to[v])) return to[v]=now,1;
		}
	}
	return 0;
}
signed main() {
	in1(n);
	For(i,1,n) {
		int x,y;
		in2(x,y);
		add(x,i);
		add(y,i);
	}
	int ans=0;
	For(i,1,10000) {
		m0(vis);
		if(!dfs(i)) {
			cout<<i-1;
			return 0;
		}
	}
	cout<<10000<<'\n';
}