bzoj1854 游戏
Do u like 玩♂游♂戏?
lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。现在lxhgww想知道他最多能连续攻击boss多少次?
二分图TAT
一开始想到的是两个属性之间连边 后来发现没有什么卵用
然后想到了可以在点的编号和攻击力间连边
然后枚举攻击力 跑匈牙利 跑不下去就break
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> #include<vector> #include<queue> #include<map> using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();} return x*f; } const int maxn=1000010; int T; int a,b,n; int first[2*maxn],to[2*maxn],next[2*maxn],cnt; int match[2*maxn],used[2*maxn]; void add(int u,int v) { to[++cnt]=v; next[cnt]=first[u]; first[u]=cnt; } int find(int x) { for(int i=first[x];i;i=next[i]) { if(used[to[i]]==T)continue; used[to[i]]=T; if(!match[to[i]] || find(match[to[i]])) { match[to[i]]=x; return 1; } } return 0; } int main() { int i; scanf("%d",&n); for(i=1;i<=n;i++) { a=read(),b=read(); add(a,i);add(b,i); } for(i=1;i<=10000;i++) { T++; if(!find(i))break; } cout<<i-1; return 0; }