题目:洛谷P1640。
题目大意:有n件装备,每件装备有两个属性,且只能用一次,用一种属性。
现在有一个boss,第i次对boss进行攻击要用属性为i的装备。
问这些装备最多能连续攻击boss几次?
解题思路:二分图匹配。对装备k的两个属性i,j,将i和j向k连一条边。
然后从1开始进行匈牙利算法,遇到第一次匹配失败跳出,此时匹配成功的次数就是答案。
C++ Code:
#include<cstdio>
#include<cstring>
#include<cctype>
int n,head[1000005],f[1000005];
bool vis[1000005];
struct edge{
int to,nxt;
}e[2000005];
inline int readint(){
char c=getchar();
for(;!isdigit(c);c=getchar());
int d=0;
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return d;
}
bool match(int u){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!vis[v]){
vis[v]=true;
if(!f[v]||match(f[v])){
f[v]=u;
return true;
}
}
}
return false;
}
int main(){
int cnt=0;
n=readint();
memset(head,0,sizeof head);
for(int i=1;i<=n;++i){
int x=readint();
e[++cnt]=(edge){i,head[x]};
head[x]=cnt;
x=readint();
e[++cnt]=(edge){i,head[x]};
head[x]=cnt;
}
memset(f,0,sizeof f);
int i;
for(i=1;;++i){
memset(vis,0,sizeof vis);
if(!match(i))break;
}
printf("%d\n",i-1);
return 0;
}