题意

描述

一个二分图\((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;
    }

转载于:https://www.cnblogs.com/Paul-Guderian/p/10590741.html

【纪中集训2019.3.23】Deadline相关推荐

  1. 【纪中集训2019.3.25】芬威克树

    题目 描述 ​ ​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和: ​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变: ​ 维护第二段代码执行\(ADD(x,v)\) ...

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

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

  3. 【纪中集训2019.3.20】铁路

    题意 描述 现在有一颗树形状的双向铁路,每条边的行驶时间是\(1\): 给出\(m\)条列车行驶的路径\(s_{i}\to t_{i}\),问列车相遇的对数(无序对): \(i和j\)号列车相遇当且仅 ...

  4. 【纪中集训2019.3.26】动态半平面交

    题目 描述 : 给出强制在线参数\(k\),树的大小\(n\),和每个点的点权\(a_i\); 有\(m\)个询问,每个询问是$u ,d $ 的形式: 表示询问\(u\)为根的子树中,和\(u\)的距 ...

  5. 【纪中集训2019.3.30】星辰大海

    题目 描述 ​ 有\(n\)个点\(p_1 ,p_2 , \cdots ,\,p_n\) : ​ 现在\(p_1\)不见了,可能的横纵坐标范围是\([-10^6,10^6]\): ​ 同时需要保证每三 ...

  6. 【纪中集训2019.3.15】恶熊咆哮

    题目 描述 有\(n\)只熊,初始时坐标为\((x_i,y_i)\): 这些熊会按照标号依次吼叫,当第\(i\)只熊吼叫,其他熊会移动: \((x_i,y_i)\)会移动到\((x_i \pm 1,y ...

  7. 2019寒假纪中集训总结学期总结(流水账)

    学期总结 这学期上了初三,学校的初.高中校区对调,我们的班主任也由一个生物老师换成了一个化学老师. 之前的班主任比较年轻,跟我们这群学生有这很好的感情,亦师亦友,陪伴我们度过了几乎没有中考压力的初一. ...

  8. [2021.8纪中集训Day14]

    文章目录 1312. 老曹的忧郁 题目 思路 代码 1313. 老曹骑士 题目 思路 代码 1314. 稳定的数字 题目 思路 代码 封锁阳光大学 题目 题目描述 输入格式 输出格式 输入输出样例 说 ...

  9. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  10. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

最新文章

  1. Extjs中createDelegate的作用
  2. 鸿蒙安卓哪个app好,可以放下对华为鸿蒙的担忧了,操作和EMUI相似,能兼容安卓APP - 区块网...
  3. 如何在Marketing Cloud的弹出UI窗口里添加扩展字段
  4. 用法与区别_生抽老抽、蚝油味极鲜,总算搞清楚区别了,用法大不同,别用错了...
  5. 第一节《Git初始化》
  6. pycham窗口显示多个编辑页面
  7. 微课|中学生可以这样学Python(2.3.4节):例2-2
  8. 64如何传入后台_如何保证API接口数据安全?
  9. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql
  10. 基于Springboot实现商品进销存管理系统
  11. STM32单片机Flash模拟EEPROM
  12. android扫描局域网打印机,Android 浅谈同一局域网下使用WiFi连接打印机
  13. 动物生存竞争对投资的启示!
  14. 使用expdp和impdp导出导入本地oracle数据.dmp文件
  15. 拼团系统开发|全民拼购商业模式解读
  16. 使用火车头采集器的时候往文本之中均匀的插入图片
  17. run和start区别
  18. 神武服务器维护打副本,《神武4》电脑版:零氪也能玩转新服 注重细节能挣不少神武币...
  19. 全网通报:数模国赛作弊的后果
  20. 杨米尔斯理论讲了什么

热门文章

  1. angular.js学习笔记
  2. border-radius几种写法的原理剖析
  3. 2009年统考计算机考研真题
  4. v8go 库手动编译 v8 golang 库手动编译
  5. C++ 类的静态成员变量为什么一定要初始化
  6. maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
  7. python 字符串不相等_python实现找出来一个字符串中最长不重复子串
  8. oracle tochar fm,oracle的to_char中的fm-Oracle
  9. 换了路由器电脑都连不上网了_如果你连汽滤多久换一次,都不知道,就不要说自己是老司机了...
  10. android的简单知识,Android基础知识(简单实例计算器)