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

网络流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;
}

 

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