BZOJ1854

一种武器两个能力值,只能选其一,一个武器只能用一次。

第一次选一个能力值为1的,第二次选能力值为2的······

问最多能选到多少能力值。

把两个能力值与武器连一条边,跑二分图匹配,看看知道多少能力值无法被匹配即为ans

对于vis数组有一个神奇的处理,不用每次都初始化。

#include<cstdio>
#include<cstdlib>
#include<cstring>
int mat[1000005];
int vis[1000005];
int first[1000005];
struct mod{int x,y,next;};
mod q[2000005];
int len=0;
int o=0;
void ins(int x,int y)
{
len++;
q[len].x=x;
q[len].y=y;
q[len].next=first[x];
first[x]=len;
}
bool dfs(int x)
{
for (int i=first[x];i!=0;i=q[i].next)
{
int y=q[i].y;
if (vis[y]==o)continue;
vis[y]=o;
if (mat[y]==-1||dfs(mat[y])==true)
{
mat[y]=x;
return true;
}
}
return false;
}
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,i);
ins(y,i);
}
memset(mat,-1,sizeof(mat));
memset(vis,0,sizeof(vis));
for (int i=1;i<=1000000;i++)
{
o++;
if (dfs(i)==false)
{printf("%d",i-1);break;}
}
}

posted on 2016-11-08 13:48  Notok  阅读(133)  评论(0编辑  收藏  举报

导航