luogu P2071 座位安排 二分图最大匹配 双重的

Posted qingyuyyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P2071 座位安排 二分图最大匹配 双重的相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iomanip>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=4004;
int read()
{
    int res=0,ch,flag=0;
    if((ch=getchar())==-)             //判断正负
        flag=1;
    else if(ch>=0&&ch<=9)           //得到完整的数
        res=ch-0;
    while((ch=getchar())>=0&&ch<=9)
        res=res*10+ch-0;
    return flag?-res:res;
}
int n,m;
int result[N][2],use[N];
int e[N*16],ne[N*16],idx,h[N*16];
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}

bool dfs(int now)
{

    for(int j=h[now]; ~j; j=ne[j])
    {
        int v=e[j];
        if(!use[v])
        {
            use[v]++;
            if(!result[v][0]||dfs(result[v][0]))
            {
                result[v][0]=now;
                return true;
            }
            if(!result[v][1]||dfs(result[v][1]))
            {
                result[v][1]=now;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    memset(h,-1,sizeof h);
    n=read();
    for(int i=1; i<=n*2; i++)
    {
        int a=read(),b=read();
        add(i,a);
        add(i,b);
    }
    int ans=0;
    for(int i=1; i<=n*2; i++)
    {
        memset(use,0,sizeof(use));
        if(dfs(i))
            ans++;
    }
    cout<<ans<<endl;
}

 

以上是关于luogu P2071 座位安排 二分图最大匹配 双重的的主要内容,如果未能解决你的问题,请参考以下文章

P2071 座位安排(二分图最大匹配)

luogu P2071 座位安排

p2071 座位安排

[二分图最大匹配]LuoGu P2417 课程

洛谷——P2071 座位安排 seat.cpp/c/pas

洛谷 P2071 座位安排 seat.cpp/c/pas