题意

描述

一个二分图\((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. Linux系列——安装双系统Ubuntu

    作为一个穷人,电脑破得不行却没钱换,怎么办呢,不如换个Ubuntu吧,没有Windows那么多后台应用,在我这台古董上稍微流畅一点. Linux有很多发行版,比较流行和适合入门的就是Ubuntu和De ...

  2. sqli-labs学习笔记 DAY4

    DAY 4 sqli-labs lesson 23 与lesson 1一样,只不过屏蔽了#和–注释符. 报错型注入: 爆库:id=99' UNION SELECT 1,extractvalue(1,c ...

  3. DenseNet——Densely Connected Convolutional Networks

    1. 摘要 传统的 L 层神经网络只有 L 个连接,DenseNet 的结构则有 L(L+1)/2 个连接,每一层都和前面的所有层进行连接,所以称之为密集连接的网络. 针对每一层网络,其前面所有层的特 ...

  4. Ubuntu16.04安装vmware workstation14

    1.获得vmware安装包:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html?ClickI ...

  5. Django_cookie+session

    一.cookie和session介绍 cookie 由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁 ...

  6. oracle数据update后怎么恢复到以前的数据

    http://blog.csdn.net/itdada/article/details/52746392

  7. to_char

    to_date(to_char(to_date(#{conds.currentTime,jdbcType=VARCHAR},'YYYY-MM-DD hh24:mi:ss'),'hh24:mi:ss') ...

  8. Task 9 从用户界面和体验分析“360极速浏览器”

    我目前使用的浏览器是360极速浏览器,下面将针对用户界面.记住用户选择.短期刺激.长期使用的好处坏处.不要让用户犯简单的错误四个方面对其进行评估: 1.用户界面: 01 可视性原则--网络没有连接或者 ...

  9. struts2 Action生命周期

    Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if spec ...

  10. Oracle Form Builder

    Oracle Form Builder 是Oracle的一个开发工具,可以针对Oracle公司的E-Business Suit的ERP系统开发的.对应的还有reports builder. Oracl ...