前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「网络流 24 题」搭配飞行员 (二分匹配 最大匹配)

「网络流 24 题」搭配飞行员 (二分匹配 最大匹配)

作者头像
Lokinli
发布2023-03-09 17:01:41
1410
发布2023-03-09 17:01:41
举报
文章被收录于专栏:以终为始

题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员。由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多。 因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行。 输入格式 第一行,两个整数 n n n 与 m m m,表示共有 n n n 个飞行员,其中有 m m m 名飞行员是正驾驶员。 下面有若干行,每行有 2 2 2 个数字 a a a、b b b。表示正驾驶员 a a a 和副驾驶员 b b b 可以同机飞行。 注:正驾驶员的编号在前,即正驾驶员的编号小于副驾驶员的编号。 输出格式 仅一行一个整数,表示最大起飞的飞机数。 样例 样例输入                                      样例输出 10 5                                               4 1 7 2 6 2 10 3 7 4 8 5 9

题解:二分匹配最大匹配模板。

代码语言:javascript
复制
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 300;
vector<int>E[maxn];
int used[maxn];
int match[maxn];
int n,m;
void add_edge(int u,int v)
{
    E[u].push_back(v);
    E[v].push_back(u);
}
bool dfs(int x)
{
    used[x] = 1;
    for(int i = 0; i < E[x].size(); i ++)
    {
        int u = E[x][i];
        int v = match[u];
        if(v == -1 || used[v] == -1 && dfs(v))
        {
            match[u] = x;
            match[x] = u;
            return true;
        }
    }
    return false;
}
int max_match()
{
    int res = 0;
    memset(match,-1,sizeof(match));
    for(int i = 1; i <= m; i ++)
    {
        if(match[i] == -1)
        {
            memset(used,-1,sizeof(used));
            if(dfs(i))
                res ++;
        }
    }
    return res;
}
int main()
{
    scanf("%d %d",&n, &m);
    int u,v;
    while(scanf("%d %d",&u,&v)!=EOF)
    {
        add_edge(u,v);
    }
    int ans = max_match();
    printf("%d\n",ans);
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档