zoukankan      html  css  js  c++  java
  • 洛谷 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;
    } 
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    String_字符串各个场景下的==
    jvm_run-time method area
    jvm类加载_类的流程
    TypeError: Restaurant() takes no arguments
    EMC测试国家标准GB/T 17626
    8-8 用户的专辑
    8-7 专辑
    8-6 城市名
    7-6 三个出口
    TypeError: module() takes at most 2 arguments (3 given)
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8228039.html
Copyright © 2011-2022 走看看