您的位置:首页 > 其它

bzoj1191 [HNOI2006]超级英雄Hero

2017-08-29 07:43 316 查看
题目

显然,一个题目对应多个锦囊,显然是最大匹配,匈牙利算法上。

值得注意的是,从1~n,只要有一个找不到匹配,就直接退出,注意读题233。

//匈牙利算法最大匹配
#include<bits/stdc++.h>
#define N 10010
using namespace std;
int n,m,ans;
bool used[N+1];
int G[N+1][2],lk[N+1];
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
int x=0,b=1;
char c=nc();
for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;
for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';
return x*b;
}
inline bool find(int x)
{
for(int i=0;i<=1;i++)
{
int u=G[x][i];
if(used[u])continue;
used[u]=true;
if(!lk[u]||find(lk[u]))
{
lk[u]=x;
return true;
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
n=read(),m=read();
for(int i=1;i<=m;i++)G[i][0]=read(),G[i][1]=read();
for(int i=1;i<=m;i++)
{
memset(used,false,sizeof(used));
if(find(i))ans++;
else  break;
}
cout<<ans;
return 0;
}

cef5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: