• [Cogs14] [网络流24题#1] 飞行员分配方案 [网络流,最大流,二分图匹配]


    经典二分图匹配,可以用匈牙利算法,也可以用最大流

    代码如下(Dinic):

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    template<const int _n>
    struct Edge
    {
        struct Edge_base { int    to,next,w; }e[_n]; int    p[_n],cnt;
        void    insert(const int x,const int y,const int z)
        { e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; p[x]=cnt; return ; }
        int    start(const int    x) { return p[x]; }
        void    clear() { cnt=1;memset(p,0,sizeof(p)); }
        Edge_base&    operator[](const int x) { return e[x]; }
    };
    
    int    n,m,flow,SSS,TTT;
    int    level[110],From[110],From_e[110];
    Edge<310>    e;
    
    bool    Bfs(const int S)
    {
        int    i,t;
        queue<int>    Q;
        memset(level,0,sizeof(level));
        memset(From,0,sizeof(From));
        level[S]=1;
        Q.push(S);
        while(!Q.empty())
        {
            t=Q.front(),Q.pop();
            for(i=e.start(t);i;i=e[i].next)
            {
                if(!level[e[i].to] && e[i].w)
                {
                    level[e[i].to]=level[t]+1;
                    Q.push(e[i].to);
                    From[e[i].to]=t;
                    From_e[e[i].to]=i;
                    if(e[i].to==TTT)goto End;
                }
            }
        }
    End:
        if(!level[TTT])return false;
        flow++;
        for(i=TTT;i!=SSS;i=From[i])e[From_e[i]].w--,e[From_e[i]^1].w++;
        return true;
    }
    
    int    Dinic()
    {
        while(Bfs(SSS));
        return flow;
    }
    
    int main()
    {
        freopen("flyer.in","r",stdin);
        freopen("flyer.out","w",stdout);
    
        int    i,x,y;
    
        scanf("%d%d",&m,&n);
        m=m-n;
        while(scanf("%d%d",&x,&y)==2)
        {
            if(x>y)swap(x,y);
            e.insert(x,y,1);
            e.insert(y,x,0);
        }
        
        SSS=n+m+1,TTT=n+m+2;
        for(i=1;i<=n;++i)
        {
            e.insert(SSS,i,1);
            e.insert(i,SSS,0);
        }
        for(i=n+1;i<=m+n;++i)
        {
            e.insert(i,TTT,1);
            e.insert(TTT,i,0);
        }
    
        printf("%d
    ",Dinic());
    
        return 0;
    }

    匈牙利代码:http://www.cnblogs.com/Ngshily/p/4988909.html

  • 相关阅读:
    利用systemtap学习Linux路由代码
    系统调试技巧
    linux调度器系列
    systemTAP 学习
    使用systemtap调试linux内核
    二叉树的可视化---数据结构
    linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP
    python-gdb
    中国科技大学编绎原理视频 公开课网站
    java EE 学习
  • 原文地址:https://www.cnblogs.com/Gster/p/4989304.html
Copyright © 2020-2023  润新知