飞行员配对方案(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天前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
7天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
8天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
4天前
|
机器学习/深度学习 存储 算法
基于SFLA算法的神经网络优化matlab仿真
**摘要:** 使用MATLAB2022a,基于SFLA算法优化神经网络,降低训练误差。程序创建12个神经元的前馈网络,训练后计算性能。SFLA算法寻找最优权重和偏置,更新网络并展示训练与测试集的预测效果,以及误差对比。SFLA融合蛙跳与遗传算法,通过迭代和局部全局搜索改善网络性能。通过调整算法参数和与其他优化算法结合,可进一步提升模型预测精度。
|
11天前
|
机器学习/深度学习 算法 数据挖掘
机器学习与智能优化——利用简单遗传算法优化FCM
机器学习与智能优化——利用简单遗传算法优化FCM
27 5
|
11天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
29 6
|
12天前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
12天前
|
机器学习/深度学习 算法 C语言
【深度学习】优化算法:从梯度下降到Adam
【深度学习】优化算法:从梯度下降到Adam
43 1
|
13天前
|
机器学习/深度学习 自然语言处理 算法
Adam优化算法和应用场景
Adam(Adaptive Moment Estimation)是一种用于训练深度学习模型的优化算法
24 2
|
1天前
|
存储 算法 搜索推荐
Java数据结构与算法优化
Java数据结构与算法优化