P2071 座位安排

座位安排

题目背景

公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决。

题目描述

已知车上有N排座位,有N\*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。

输入输出格式

输入格式

 

第一行,一个正整数N。 第二行至第N\*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。

输出格式

 

一个非负整数,为最多使得多少人满意。

输入输出样例

输入样例 #1

4
1 2
1 3
1 2
1 3
1 3
2 4
1 3
2 3

输出样例 #1

7

说明

对于10%的数据 N≤10 对于30%的数据 N≤50 对于60%的数据 N≤200 对于100%的数据 N≤2000 算法提示:二分图的最大匹配
 
 
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 16000;

int e[N], ne[N], h[N], idx;
int n;
int vis[N], now;
int match[N][2];

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

bool find(int x)
{
    for (int i = h[x]; ~i; i = ne[i])
    {
        int j = e[i];
        if(vis[j] != now)
        {
            vis[j] = now;
            for(int i = 0; i < 2; i++)
            {
                if(!match[j][i] || find(match[j][i]))
                {
                    match[j][i] = x;
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main()
{
    scanf("%d", &n);
    memset(h, -1 ,sizeof h);
    for (int i = 1; i <= n * 2; i++)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        add(i, a);
        add(i, b);
    }
    int res = 0;
    for (int i = 1; i <= n * 2; i++)
    {
        now++;
        if (find(i)) res++;
    }
    printf("%d", res);
    return 0;
}

 

posted @ 2021-07-09 21:51  lyc_lb  阅读(84)  评论(0)    收藏  举报
-->
查看放大的地图   |   获取路线