搭配飞行员

题目链接:https://loj.ac/problem/6000

题意:每个飞机都有一个正飞行员和次飞行员,但有些飞行员不能在同一个飞机里,问最多能起飞多少飞机。

思路:用二分图对飞行员进行匹配就可以了

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
int n,m;
int a[105][105],b[105];
bool vis[105];
void init()
{
    int i,j;
    scanf("%d%d",&n,&m);
    int u,v;
    memset(a,0,sizeof(a));
    while (~scanf("%d%d",&u,&v))
        a[u][v]=a[v][u]=1;
    memset(b,-1,sizeof(b));
}
int match(int u)
{
    int i,j;
    for (i=m+1; i<=n; i++)
    {
        if (a[u][i] && !vis[i])
        {
            vis[i]=true;
            if (b[i]==-1 || match(b[i]))
            {
                b[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    init();
    int ans=0;
    for (int i=1; i<=m; i++)
    {
        memset(vis,false,sizeof(vis));
        ans+=match(i);
    }
    printf("%d",ans);
    return 0;
}

 

posted @ 2020-02-05 17:06  ~zcb  阅读(152)  评论(0编辑  收藏  举报