BZOJ1191(HNOI2006)[超级英雄Hero]--二分图最大匹配

来源:互联网 发布:unity3d 联网 编辑:程序博客网 时间:2024/05/16 08:57

【链接】
bzoj1191

【题目大意】
给你一个数n表示“锦囊妙计”的数量,“锦囊妙计”的编号为0~n-1,另一个数m表示问题的数量,对于每一个问题都有2种“锦囊妙计”可以解答,求可以通过的最大问题数。

【解题报告】
其实此题简单一看就知道是二分图最大匹配,所以直接写就行了。主要注意的是需要答对前一道题目才能答后一道题目。

#include<cstdio>#include<cstring>using namespace std;const int maxn=1005,maxm=2005;int n,m,tot,ans,who[maxn],lnk[maxn],son[maxm],nxt[maxm];bool vis[maxn];inline int Read(){    int res=0;    char ch=getchar();    while (ch<'0'||ch>'9') ch=getchar();    while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=getchar();    return res;}void Add(int x,int y){    son[++tot]=y; nxt[tot]=lnk[x]; lnk[x]=tot;}bool Find(int x){    if (vis[x]) return 0;    vis[x]=1;    for (int j=lnk[x]; j; j=nxt[j])     if (!who[son[j]]||Find(who[son[j]])) {who[son[j]]=x; return 1;}    return 0;}int main(){    freopen("1191.in","r",stdin);    freopen("1191.out","w",stdout);    n=Read(); m=Read(); tot=0;    for (int i=1; i<=m; i++) Add(i,Read()),Add(i,Read());    memset(who,0,sizeof(who));    for (int i=1; i<=m; i++)    {        memset(vis,0,sizeof(vis));        if (Find(i)) ans++; else break;    }    printf("%d",ans);    return 0;}
阅读全文
0 0