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

BZOJ 1191 HNOI 2006 超级英雄Hero 二分图最大匹配

时间:2014-11-06 14:53:51      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:bzoj   hnoi2006   二分图最大匹配   网络流   

题目大意:闯关答题,每一个题可以用两个trick中的一个来解决,一个trick最多只能使用一次,问最多可以连续答对多少题。


思路:我一开始就想到了二分图最大匹配,但是思路完全想歪了。我看每个题有两个trick可以用,就用这个来拆点建图,显然是错的。。

正确的是用每个题和每个trick来建边,来一个问题就建两条边,然后看能不能找到增广路,如果不能就无法答对这个题,输出。


CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 5010
using namespace std;

int tricks,asks;
int head[MAX],total;
int next[MAX],aim[MAX];

int paired[MAX];
bool v[MAX];

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]]) {
			v[aim[i]] = true;
			if(!paired[aim[i]] || Hungary(paired[aim[i]])) {
				paired[aim[i]] = x;
				return true;
			}
		}
	return false;
}

int main()
{
	cin >> tricks >> asks;
	for(int x,y,i = 1; i <= asks; ++i) {
		scanf("%d%d",&x,&y);
		x++,y++;
		Add(i,x),Add(i,y);
		memset(v,false,sizeof(v));
		if(!Hungary(i)) {
			cout << i - 1 << endl;
			exit(0);
		}
	}
	cout << asks << endl;
	return 0;
}


BZOJ 1191 HNOI 2006 超级英雄Hero 二分图最大匹配

标签:bzoj   hnoi2006   二分图最大匹配   网络流   

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

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