• 洛谷 P3386 二分图匹配 题解


    题面

    这道题虽然是练习匈牙利算法的,但可以用网络流来切掉它;

    我们可以建立一个超级源和一个超级汇,超级源连接左部分点,超级汇连接右部分点;

    然后在该图上跑最大流就可以了;

    PS:我设的超级源是2001,超级汇是2002;

    #include <bits/stdc++.h>
    using namespace std;
    struct littlestar{
        int to;
        int nxt;
        int w;
    }star[5000010];
    int head[5000010],cnt;
    inline void add(int u,int v,int w)
    {
        star[++cnt].to=v;
        star[cnt].nxt=head[u];
        star[cnt].w=w;
        head[u]=cnt;
        
    }
    int n,m,e;
    int dis[3010];
    queue<int> q;
    inline bool bfs()
    {
        memset(dis,0,sizeof(dis));
        while(q.size()){
            q.pop();
        }
        q.push(2001);
        dis[2001]=1;
        while(q.size()){
            int u=q.front();
            q.pop();
            for(int i=head[u];i;i=star[i].nxt){
                int v=star[i].to;
                if(star[i].w&&!dis[v]){
                    q.push(v);
                    dis[v]=dis[u]+1;
                    if(v==2002){
                        return 1;
                    }
                }
            }
        }
        return 0;
    }
    int dinic(int u,int flow)
    {
        if(u==2002){
            return flow;
        }
        int rest=flow;
        int tmp;
        for(register int i=head[u];i&&rest;i=star[i].nxt){
            int v=star[i].to;
            if(star[i].w&&dis[v]==dis[u]+1){
                tmp=dinic(v,min(rest,star[i].w));
                if(!tmp) dis[v]=0;
                star[i].w-=tmp;
                star[i^1].w+=tmp;
                rest-=tmp;
            }
        }
        return flow-rest;
    }
    int maxflow;
    int main()
    {
        scanf("%d%d%d",&n,&m,&e);
        for(register int i=1;i<=n;i++){
            add(2001,i,1);
            add(i,2001,0);
        }
        for(register int i=1;i<=m;i++){
            add(n+i,2002,1);
            add(2002,n+i,0);
        }
        for(register int i=1;i<=e;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,n+v,1);
            add(n+v,u,0);
        }
        int flow=0;
        while(bfs()){
            while(flow=dinic(2001,999999999)) maxflow+=flow;
        }
        cout<<maxflow;
    }
    
  • 相关阅读:
    链表
    链式学习法:提升技术深度
    数组
    写点什么
    7 天掌握算法面试必考知识点: 作业安排及如何提交
    创建Mac OS root账户
    正则表达式匹配及替换
    Xcode 10 之New Build System & Legacy Build System 旧版构建系统
    性能指标:TPS、QPS、RT、吞吐量
    Objective-C和Swift语言特性
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11331586.html
Copyright © 2020-2023  润新知