题意

描述

一个二分图\((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. Homebrew -- 安装与使用

    使用 React Native,必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 推荐使用Homebrew来安装 Node 和 Watchman ...

  2. $.each()用法

    通过它,你可以遍历对象.数组的属性值并进行处理. 使用说明 each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) ...

  3. ME.kkkK

    ME.kkkK 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 50 40 • Estima ...

  4. 20172325 2017-2018-2 《Java程序设计》第五周学习总结

    20172325 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.布尔表达式的值只有真或假,表达式的结果决定了下一步将要执行的语句. 2.循环语句可以用在 ...

  5. mysql非安装包安装教程

    设置mysql的环境变量 本人设置安装的路径是:E:\WebApplication\webMySQL\mysql-5.7.13-winx64 我的电脑 ---> 高级系统配置 ---> 环 ...

  6. DPDK flow_filtering 源码阅读

    代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...

  7. Hadoop HA 深度解析

    社区hadoop2.2.0 release版本开始支持NameNode的HA,本文将详细描述NameNode HA内部的设计与实现. 为什么要Namenode HA? 1. NameNode High ...

  8. angularJS1笔记-(6)-自定义过滤器

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. C++ socket网络爬虫(1)

    C++写的socket网络爬虫,代码会在最后一次讲解中提供给大家,同时我也会在写的同时不断的对代码进行完善与修改 我首先向大家讲解如何将网页中的内容,文本,图片等下载到电脑中. 我会教大家如何将百度首 ...

  10. windows 下查看进程开始运行的时间

    1. 打开运行 输入 msinfo32 然后在软件环境- 正在运行任务- 就能够看到运行开始的时间了.