p1640&bzoj1854 连续攻击游戏(游戏)
题目
Input
Output
Sample Input
1 2
3 2
4 5
Sample Output
HINT
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000
分析
二分图匹配的题目,左面的点表示攻击值,右面的点表示装备,从1开始枚举左面的点,如果不能继续匹配则跳出循环,否则ans+1
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
vector<int>v[10100];
int wh[1000010],used[1000010],t,n,ans;
bool work(int x){
int i,j,k;
for(i=0;i<v[x].size();i++)
if(used[v[x][i]]!=t){
used[v[x][i]]=t;
if(!wh[v[x][i]]||work(wh[v[x][i]])){
wh[v[x][i]]=x;
return 1;
}
}
return 0;
}
void go(){
int i,j,k;
for(i=1;i<=10000;i++){
t=i;
if(!work(i))break;
ans++;
}
}
int main()
{ int i,j,k,x,y;
cin>>n;
for(i=1;i<=n;i++){
cin>>x>>y;
v[x].push_back(i);
v[y].push_back(i);
}
go();
cout<<ans<<endl;
return 0;
}