题目:洛谷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 ",i-1); return 0; }