码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-27 14:41:05      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:bzoj   scoi 2010   二分图   二分图最大匹配   hungary   

题目大意:现在要打一个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;
}


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

标签:bzoj   scoi 2010   二分图   二分图最大匹配   hungary   

原文地址:http://blog.csdn.net/jiangyuze831/article/details/41543747

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!