网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解

题目传送门

题意概括

裸的二分图匹配

题解

匈牙利算法

上板子

代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=100+5;
int m,n,a,b,match[N],x[N],y[N];
bool g[N][N],vis[N];
bool dfs(int k){
    for (int i=1;i<=n;i++)
        if (g[k][i]&&!vis[i]){
            vis[i]=1;
            if (match[i]==-1||dfs(match[i])){
                match[i]=k;
                return 1;
            }
        }
    return 0;
}
int main(){
    memset(g,0,sizeof g);
    scanf("%d%d",&m,&n);
    while (scanf("%d%d",&a,&b)&&(a!=-1&&b!=-1))
        g[a][b]=g[b][a]=1;
    memset(match,-1,sizeof match);
    int cnt=0;
    for (int i=1;i<=n-m;i++){
        memset(vis,0,sizeof vis);
        if (dfs(i+m))
            cnt++;
    }
    int tot=0;
    for (int i=1;i<=m;i++)
        if (match[i]!=-1)
            x[++tot]=i,y[tot]=match[i];
    if (tot==0)
        printf("No Solution!");
    else
        printf("%d\n",tot);
    for (int i=1;i<=tot;i++)
        printf("%d %d\n",x[i],y[i]);
    return 0;
}
时间: 2024-10-14 12:07:29

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法的相关文章

网络流24题 洛谷 2756 飞行员配对方案

代码风格迥异 -- 1 #include<bits/stdc++.h> 2 3 const int N=1000+5; 4 5 using namespace std; 6 7 int link[N],g[N][N],ansx[N]; 8 int n,m,u,v,ans; 9 bool vis[N]; 10 11 inline void read( int&x ) { 12 int f=1;x=0;char c=getchar(); 13 while(c>'9'||c<'0

洛谷 P2756 飞行员配对方案问题

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

[洛谷P2756]飞行员配对方案问题

题目大意:有m个外籍飞行员和n个英国飞行员,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.现在一架飞机要一名外籍飞行员和一名英国飞行员开,且他们必须有默契,求一次最多能开出多少飞机. 解题思路:明显二分图匹配,我用的匈牙利算法(当然网络流也可以,只不过代码量会大一点). C++ Code: #include<bits/stdc++.h> using namespace std; int m,n,s; bool b[105][105],used[105]; int lft[105];

洛谷—— P3386 【模板】二分图匹配

https://www.luogu.org/problem/show?pid=3386 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 1 1 1 1 1 输出样例#1: 1 说明 n,m<=1000,1<=u<=n,1<=v<=m 因为数据有坑,可能会遇到v

洛谷P3386 【模板】二分图匹配

匈牙利算法模板 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=1010; 10 int read(){ 11 int x=0,f=1;

【网络流24题】【Luogu P2756】飞行员配对方案问题

题目大意: 你有一个二分图,分别求出它的匹配数与各个连接匹配的两个点. 正文: 本题考虑用网络流,求匹配数就是二分图匹配模板,但是我们还要求各个连接匹配的两个点. 从网络流(\(\texttt{DINIC}\))的角度来思考,想匹配的边有什么特性.(给你几秒钟思考时间)我们发现不是匹配的边原来的边权(\(=1\)),发生了改变,那么只用判断是否改变就行了. 代码: for (int i = 2; i <= tot; i += 2) { if(e[i].y != s && e[e[i]

洛谷 P2764 最小路径覆盖问题【匈牙利算法】

经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream> #include<cstdio> using namespace std; const int N=505,M=120005; int n,m,h[N],cnt,lk[N],t,v[N],ans; struct qwe { int ne,to; }e[M]; int read() { int

网络流24题第一题(luogu2796飞行员配对方案)

飞行员配对方案 二分图裸题,可以拿最大流怼. 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于

【网络流24题】飞行员配对方案问题

[网络流24题]飞行员配对方案问题 题面 这些题都用Cogs交算了 因为cogs有SPJ 题面 题解 很简单的二分图匹配 匈牙利算法就能够解决 求最大流的话 再加上一个源点一个汇点即可 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set>