題目大意:闖關答題,每一個題可以用兩個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;
}