题意

描述

一个二分图\((A,B)\),每个点额外有一个颜色0或者1;

匹配时,只能相同颜色的点匹配;

给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小;

范围

$1 \le n , m \le 2000 \ , \ 1 \le k \le 5000 $

题解

  • 将\(A\)中的点按照标号划分为\(v_0和v_1\);

  • 将B中的点拆成\(u_0\)和\(u_1\),\(u_0\)向\(u_1\)连流量为\(1\)的边;

  • \(S\)向\(v_0\)连流量为1的边,\(v_1\)向​\(T\)连流量为​\(1\)的边;

  • \(v_0\)向原图中相连的\(u_0\)连\(inf\)边,\(u_1\)向\(v_1\)连\(inf\)边;

  • 简单说明:

  • 可以转化为一种标号使得最小点覆盖最小;

  • \(<S,v_0> \ , \ <u_0,u_1> \ , \ <v_1,T>\) 被割分别代表\(v_0,u,v_1\)被选入覆盖集;

  • 只需要说明割和合法方案等价:

  • 由于不存在一条从\(S\)到\(T\)的残量路径,所以要么\(u\)被割了,要么\(u\)两边相连的点至少一边被割了;

  • 这和合法方案的条件是等价的;

  • 所以\(ans\)=最小割;

  • 考试的时候因为当初做网络流的时候没有理解深刻并且有太久没有做了,所以没有做出来;

    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int N=10010;
    char gc(){
    static char*p1,*p2,s[1000000];
    if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=0;char c=gc();
    while(c<'0'||c>'9')c=gc();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    return x;
    }
    int n,m,k,o,hd[N],p[N],S,T,d[N],vis[N],cur[N];
    struct Edge{int v,nt,f;}E[N<<1];
    void adde(int u,int v,int f){
    E[o]=(Edge){v,hd[u],f};hd[u]=o++;
    E[o]=(Edge){u,hd[v],0};hd[v]=o++;
    }
    bool bfs(){
    static queue<int>q;
    for(int i=S;i<=T;++i)d[i]=vis[i]=0;
    while(!q.empty())q.pop();
    d[S]=vis[S]=1;q.push(S);
    while(!q.empty()){
    int u=q.front();q.pop();
    for(int i=hd[u];~i;i=E[i].nt)if(E[i].f){
    int v=E[i].v;
    if(vis[v])continue;
    d[v]=d[u]+1;
    q.push(v);
    vis[v]=1;
    if(v==T)return true;
    }
    }
    return false;
    }
    int dfs(int u,int F){
    if(u==T||!F)return F;
    int flow=0,f;
    for(int i=cur[u];~i;i=E[i].nt){
    int v=E[cur[u]=i].v;
    if(d[v]==d[u]+1&&(f=dfs(v,min(E[i].f,F)))){
    flow+=f;F-=f;
    E[i].f-=f;E[i^1].f+=f;
    if(!F)break;
    }
    }
    return flow;
    }
    int dinic(){
    int flow=0;
    while(bfs()){
    for(int i=S;i<=T;++i)cur[i]=hd[i];
    flow+=dfs(S,inf);
    }
    return flow;
    }
    int main(){
    freopen("deadline.in","r",stdin);
    freopen("deadline.out","w",stdout);
    memset(hd,-1,sizeof(hd));
    n=rd();m=rd();k=rd();S=0;T=n+m*2+1;
    for(int i=1;i<=n;++i)if(p[i]=rd())adde(S,2*m+i,1);else adde(2*m+i,T,1);
    for(int i=1;i<=m;++i)adde(i*2-1,i*2,1);
    for(int i=1;i<=k;++i){
    int u=rd(),v=rd();
    if(p[u])adde(m*2+u,v*2-1,inf);
    else adde(v*2,m*2+u,inf);
    }
    int ans=dinic();
    cout<<ans<<endl;
    return 0;
    }

【纪中集训2019.3.23】Deadline的更多相关文章

  1. 【纪中集训2019.3.23】IOer

    题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...

  2. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  3. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  4. 【纪中集训2019.3.11】Cubelia

    题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...

  5. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  6. 【纪中集训2019.3.12】Z的礼物

    题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...

  7. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  8. 纪中集训 Day 2

    今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...

  9. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

随机推荐

  1. ualias命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/yexiangcsdn/article/details/82782667 个人分类: Linux Command 所属专栏: ...

  2. 投稿007期|令人震惊到发指的PyObject对象代码设计之美

    前言 最近在重温经典漫画<SlamDunk>的全国大赛篇,其中的一个情形可以很好的诠释虎躯一震这个状态——当樱木看到流川枫一次高难度投篮时内心的感受:“经过两万次射球练习后,樱木首次明白到 ...

  3. 第35次Scrum会议(11/23)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...

  4. java判断字符串编码

    是 public static String getEncoding(String str){ String encoding = "UTF-8"; try { if (str.e ...

  5. web06-PanduanLogin

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  6. Servlet 3.0对上传的支持

    Servlet 2.5 进行上传   首先对表单的要求     ->method ="post"    ->enctype="multipart/form-d ...

  7. linux 常用命令-配置登陆方式

    使用阿里云服务器,启动实例(ubuntu 7.4,密码登录)后,通过xshell登陆,但是发现xshell中密码登录是灰色禁用的,很惆怅啊,明明设置的就是密码登录,在xshell中找了一通设置发现并没 ...

  8. Leetcode题库——4.寻找两个有序数组的中位数

    @author: ZZQ @software: PyCharm @file: findMedianSortedArrays.py @time: 2018/10/10 19:24 说明:给定两个大小为 ...

  9. Aspose 插件

    百度:Aspose Aspose.Cells.dll Aspose.Slides.dll Aspose.Words.dll

  10. JabRef学习笔记(一)

    JabRef简介 JabRef is an open source bibliography reference manager. The native file format used by Jab ...