题目大意:闯关答题,每一个题可以用两个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 二分图最大匹配
原文地址:http://blog.csdn.net/jiangyuze831/article/details/40860407