UOJ Logo zgjkt的博客

博客

【bzoj1191】超级英雄Hero

2015-05-08 14:03:17 By zgjkt

题目大意

给出$m$道题,$n$个锦囊妙计,每道题必须使用其对应的两个锦囊妙计之一才能通过,继续去做下一道题,每个锦囊妙计只要用过一次就不能再用,问最多能做完多少道题。

数据范围

$1\leqslant n\leqslant 1000,1\leqslant m\leqslant 1000$


题解

每个问题只要一个锦囊妙计就能通过,每个锦囊妙计只能用一次,很容易想到这就是二分图匹配

把每个问题和对应的两个锦囊妙计连一条边,求一边二分图匹配就行了

注意按照题意,若是有一个问题无法与锦囊妙计匹配就要输出匹配数结束程序了!


程序

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define For(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

int map[1050][1050],link[1050],flag[1050];
int n,m,ans;

int check(int x){
    For(j,0,n-1)
        if ((!flag[j])&&(map[x][j])){
            flag[j]=1;
            if ((!link[j])||(check(link[j]))){link[j]=x;return 1;}
        }
    return 0;
}

int main(){
    scanf("%d%d",&n,&m);
    For(i,1,m){
        int a,b;
        scanf("%d%d",&a,&b);
        map[i][a]=map[i][b]=1;
    }
    For(i,1,m){
        memset(flag,0,sizeof(flag));
        if (check(i)) ans++;
        else break;
    }
    printf("%d\n",ans);
    return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。