飞行员配对方案(Dinic求最大二分图匹配(对匈牙利算法的优化),以及二分图的建图方式)

简介: 飞行员配对方案(Dinic求最大二分图匹配(对匈牙利算法的优化),以及二分图的建图方式)


二分图最大流建图方式:

1.源点S与每个外籍飞行员有向边连边,权值为1

2.每个英国本地飞行员与汇点连接有向边,权值为1

3根据题意,外籍与本地飞行员连接有向边,权值为1.

输出方式:

最后输出方案数:

当某个可行流被选了之后经过的所有正向边都会− = t -=t=t.

最后中间外籍与本地飞行员连接关系的正向有向边如果为0,则此边为最小割集(已被选出)即最大流,

割集对应的点,就是选的方案

1.最大流

#include<bits/stdc++.h>
using namespace std;
const int N=110,M=20200,INF=0x3f3f3f3f;
int h[N],e[M],f[M],ne[M],idx;
int q[N],d[N],cur[N];
int n,m,S,T;
void add(int a,int b,int c)
{
    f[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    f[idx]=0,e[idx]=a,ne[idx]=h[b],h[b]=idx++;
}
bool bfs()
{
    int hh=0,tt=0;
    memset(d,-1,sizeof d);
    q[0]=S,d[S]=0,cur[S]=h[S];
    while(hh<=tt)
    {
        int t=q[hh++];
    for(int i=h[t];~i;i=ne[i])
    {
        int ver=e[i];
        if(d[ver]==-1&&f[i])
        {
                d[ver]=d[t]+1;
                cur[ver]=h[ver];//当前弧优化
                if(ver==T) return true;
                q[++tt]=ver;
        }
    }
    }
    return false;
}
int find(int u,int limit)
{
    if(u==T) return limit;
    int flow=0;
    for(int i=cur[u];~i&&flow<limit;i=ne[i])
    {
        cur[u]=i;//当前弧
        int ver=e[i];
        if(d[ver]==d[u]+1&&f[i])
        {
            int t=find(ver,min(limit-flow,f[i]));
            if(!t) d[ver]=-1;
            f[i]-=t; f[i^1]+=t; flow+=t;
        }
    }
    return flow;
}
int dinic()
{
    int r=0,flow;
    while(bfs())
    {
        while(flow=find(S,INF))
        r+=flow;
    }
    return  r;
}
int main()
{
    scanf("%d%d",&m,&n);
    S=0;
    T=n+1;
    memset(h,-1,sizeof(h));
    for(int i=1;i<=m;i++) add(S,i,1);
    for(int i=m+1;i<=n;i++) add(i,T,1);
    int x,y;
    while(scanf("%d%d",&x,&y),x!=-1||y!=-1)
    {
        add(x,y,1);
    }
    printf("%d\n",dinic());
    for(int i=0;i<idx;i+=2)
    {
        if(e[i]>m&&e[i]<n+1&&!f[i])
        {
            printf("%d %d\n",e[i^1],e[i]);
        }
    }
    return 0;
}

2.使用匈牙利算法:

#include<bits/stdc++.h>
using namespace std;
const int N=100,M=10000;
int h[N],e[M],ne[M],idx;
int n,m;
int match[N];
bool st[N];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool find(int x)
{
    for(int i=h[x];~i;i=ne[i])
    {
        int j=e[i];
        if(!st[j])
        {
            st[j]=1;
            if(match[j]==0||find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d%d",&m,&n);
    memset(h,-1,sizeof h);
    int a,b;
    while(scanf("%d%d",&a,&b),a!=-1||b!=-1)
    {
        add(a,b);
    }
    int res=0;
    for(int i=1;i<=m;i++)
    {
        memset(st,0,sizeof st);
        if(find(i)) res++;
    }
    cout<<res<<"\n";
    for(int i=m+1;i<=n;i++)
    {
        if(match[i])
        cout<<match[i]<<' '<<i<<"\n";
    }
}
目录
相关文章
|
6月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
7月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
377 14
|
6月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
492 5
|
7月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
233 1
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
|
7月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
340 1
|
7月前
|
算法 机器人 Serverless
【机器人路径规划】基于6种算法(黑翅鸢优化算法BKA、SSA、MSA、RTH、TROA、COA)求解机器人路径规划研究(Matlab代码实现)
【机器人路径规划】基于6种算法(黑翅鸢优化算法BKA、SSA、MSA、RTH、TROA、COA)求解机器人路径规划研究(Matlab代码实现)
699 2
|
7月前
|
机器学习/深度学习 算法 Java
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
409 1
|
7月前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
305 1

热门文章

最新文章