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

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2071 座位安排 seat.cpp/c/pas相关的知识,希望对你有一定的参考价值。

题目背景

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

题目描述

已知车上有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<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 14010
using namespace std;
int n,m,ans;
int src,decc,tot=1;
int lev[MAXN],cur[MAXN];
int to[MAXN*2],cap[MAXN*2],net[MAXN*2],head[MAXN];
void add(int u,int v,int w){
    to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
    to[++tot]=u;cap[tot]=0;net[tot]=head[v];head[v]=tot;
}
bool bfs(){
    queue<int>que;
    for(int i=src;i<=decc;i++){
        lev[i]=-1;
        cur[i]=head[i];
    }
    que.push(src);lev[src]=0;
    while(!que.empty()){
        int now=que.front();
        que.pop();
        for(int i=head[now];i;i=net[i])
            if(lev[to[i]]==-1&&cap[i]>0){
                que.push(to[i]);
                lev[to[i]]=lev[now]+1;
                if(to[i]==decc)    return true;
            } 
    }
    return false;
}
int dinic(int now,int flow){
    if(now==decc)    return flow;
    int rest=0,detal;
    for(int & i=cur[now];i;i=net[i])
        if(lev[to[i]]==lev[now]+1&&cap[i]>0){
            detal=dinic(to[i],min(flow-rest,cap[i]));
            if(detal){
                rest+=detal;
                cap[i]-=detal;
                cap[i^1]+=detal;
                if(rest==flow)    break;
            }
        }
    if(rest!=flow)    lev[now]=-1;
    return rest;
}
int main(){
    scanf("%d",&n);
    src=0;decc=n*3+1;
    for(int i=1;i<=2*n;i++){
        int s1,s2;add(src,i,1);
        scanf("%d%d",&s1,&s2);
        add(i,2*n+s1,1);add(i,2*n+s2,1);
    }
    for(int i=1;i<=n;i++)    add(2*n+i,decc,2);
    while(bfs())
        ans+=dinic(src,0x7f7f7f7f);
    cout<<ans;
} 

 

以上是关于洛谷 P2071 座位安排 seat.cpp/c/pas的主要内容,如果未能解决你的问题,请参考以下文章

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

p2071 座位安排

luogu P2071 座位安排

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

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

HDU-4532湫秋系列故事——安排座位