现在的位置: 首页 > 综合 > 正文

BZOJ 1854 SCOI 2010 游戏 二分图最大匹配

2017年11月21日 ⁄ 综合 ⁄ 共 818字 ⁄ 字号 评论关闭

题目大意:现在要打一个BOSS,一个人有n个武器,一个武器有两个属性值,但是一个武器只能攻击一次。这个BOSS需要从1连续递增输出,问输出的最大值为多少。

思路:以前好像做过一个相似的问题,也是这么做的,哪个忘了。。

很明显的二分关系是攻击力和武器,因为一个攻击力需要攻击一次,一个武器只能攻击一次,然后武器和攻击力之间连边,从1开始匹配,什么时候不能匹配了就输出。

memset会T的,时间戳大法好。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 1010010
#define BASE 10001
using namespace std;

int cnt;
int head[MAX],total;
int next[MAX << 1],aim[MAX << 1];

int paired[MAX];
int v[MAX],T;

inline void Add(int x,int y)
{
	next[++total] = head[x];
	aim[total] = y;
	head[x] = total;
}

bool Hungary(int x)
{
	for(int i = head[x]; i; i = next[i])
		if(v[aim[i]] != T) {
			v[aim[i]] = T;
			if(!paired[aim[i]] || Hungary(paired[aim[i]])) {
				paired[aim[i]] = x;
				return true;
			}
		}
	return false;
}

int main()
{
	cin >> cnt;
	for(int x,y,i = 1; i <= cnt; ++i) {
		scanf("%d%d",&x,&y);
		Add(x,i + BASE);
		Add(y,i + BASE);
	}
	for(int i = 1; i <= BASE; ++i) {
		++T;
		if(!Hungary(i)) {
			cout << i - 1 << endl;
			return 0;
		}
	}
	return 0;
}

抱歉!评论已关闭.