码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-04 01:12:55      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:完整   P20   eof   space   mem   str   main   void   man   

#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 座位安排 二分图最大匹配 双重的

标签:完整   P20   eof   space   mem   str   main   void   man   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/13041055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!