BZOJ1854 匈牙利算法

https://www.lydsy.com/JudgeOnline/problem.php?id=1854

刚学的匈牙利算法

由于每个点最多连两条边

所以复杂度是线性的

上代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int ver[N],head[N],Next[N],match[N],v[N];
int tot=0;
int ans=1;
void add(int x,int y){
    ver[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
}

bool dfs(int x){
    for(int i=head[x],y;i;i=Next[i]){
        if(v[y=ver[i]]!=ans){
            v[y]=ans;
            if(match[y]==0||dfs(match[y])){
                match[y]=x;
                return true;
            }
        }
    }
    return false;
}

int main(){
    int n,x,y;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&x,&y);
        add(x,i);
        add(y,i);
    }
    for(int i=1;i<=10001;++i){
        if(dfs(i)) ++ans;
        else break;
    }
    printf("%d\n",ans-1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值