题目:连续攻击游戏
思路:二分图匹配问题。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000000
#define maxm 10000
#define read(x) scanf("%d",&x)
int n;
vector<int> a[maxn+5];
int use[maxm+5];
int mch[maxn+5];
int dfs(int x) {
if(use[x]) return false;
use[x]=true;
for(int i=0;i<a[x].size();i++) {
int y=a[x][i];
if((!mch[y])||dfs(mch[y])) {
mch[y]=x;
return true;
}
}
return false;
}
int main() {
read(n);
for(int i=1;i<=n;i++) {
int x,y;
read(x),read(y);
a[x].push_back(i);
a[y].push_back(i);
}
int ans=0;
for(int i=1;i<=maxm;i++) {
if(dfs(i)) ans++;
else break;
memset(use,0,sizeof(use));
}
printf("%d",ans);
}