题意

给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定。染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的。求出这两个新的二分图的最大匹配数的和的最小值。数均小于等于5000。


思考

这是简化题意。由于暴力很难写,考虑网络流。将B集合中的每一个点根据其颜色分为一类和二类点。对于A集合中的每一个点,拆成两个点,两点连1的单向边,将所有相邻的一类点连线左边,另一类连向右边,值为1。所有二类点连向汇点,源点连向所有一类点。最小割。

这样,若割掉了某条边,代表了将某个点相邻的所有A集合中的点都染成了相同的颜色,并断绝了其他点的后路。


代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1E5+5;
 4 const int inf=INT_MAX;
 5 int head[maxn*2],size=1,n,m,a[maxn],dfn[maxn],S,T,x,y,ans,k;
 6 struct edge{int to,next,w;}E[maxn*2];
 7 void add(int u,int v,int w)
 8 {
 9     E[++size].to=v;
10     E[size].next=head[u];
11     E[size].w=w;
12     head[u]=size;
13
14     E[++size].to=u;
15     E[size].next=head[v];
16     E[size].w=0;
17     head[v]=size;
18 }
19 bool bfs()
20 {
21     queue<int>Q;
22     for(int i=0;i<=T;++i)dfn[i]=-1;
23     dfn[S]=0;
24     Q.push(S);
25     while(Q.size())
26     {
27         int u=Q.front();
28         Q.pop();
29         for(int i=head[u];i;i=E[i].next)
30         {
31             int v=E[i].to;
32             if(E[i].w==0||dfn[v]!=-1)continue;
33             dfn[v]=dfn[u]+1;
34             Q.push(v);
35         }
36     }
37     return dfn[T]!=-1;
38 }
39 int dinic(int u,int up)
40 {
41     if(u==T)return up;
42     int sum=0;
43     for(int i=head[u];i;i=E[i].next)
44     {
45         int v=E[i].to;
46         if(E[i].w==0||dfn[v]!=dfn[u]+1)continue;
47         int g=dinic(v,min(E[i].w,up-sum));
48         E[i].w-=g;
49         E[i^1].w+=g;
50         sum+=g;
51         if(g==0)dfn[v]=-1;
52         if(sum==up)break;
53     }
54     return sum;
55 }
56 int main()
57 {
58 //    freopen("deadline.in","r",stdin);
59 //    freopen("deadline.out","w",stdout);
60     ios::sync_with_stdio(false);
61     cin>>n>>m>>k;
62     for(int i=1;i<=n;++i)cin>>a[i];
63     for(int i=1;i<=k;++i)
64     {
65         cin>>x>>y;
66         if(a[x])add(x,y+n,inf);
67         else add(y+n+m,x,inf);
68     }
69     S=0;
70     T=n+m*2+1;
71     for(int i=1;i<=m;++i)add(i+n,i+n+m,1);
72     for(int i=1;i<=n;++i)
73         if(a[i])add(S,i,1);
74         else add(i,T,1);
75     while(bfs())ans+=dinic(S,inf);
76     cout<<ans<<endl;
77     return 0;
78 }

View Code

转载于:https://www.cnblogs.com/GreenDuck/p/10643886.html

19_04_02校内训练[deadline]相关推荐

  1. 校内训练赛题解第三篇

    校内训练赛题解 人气估值 解题思路 脑力训练计划 (模拟 + 字符串) 解题思路 大暑赛期(贪心 + 思维) 人气估值 题目描述 你是某动画制作公司的企划部长.如今动画制作公司制作的东西,已经不仅仅局 ...

  2. 19_05_01校内训练[划分]

    题意 给出长度为n的序列,只有1,0,-1.要求将其划分为若干长度在[L,R]之间的连续序列,一个序列若和大于0,造成1的贡献:若小于0,造成-1的贡献:否则没有贡献.求最大的贡献. 时间复杂度要求n ...

  3. fzyzojP3372 -- [校内训练20171124]博弈问题

    对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...

  4. 20170910校内训练

    CCT 最近学校又发了n本五三题霸,BBS看到后十分高兴.但是,当他把五三拿到手后才发现,他已经刷过这些书了!他又认真地看了一会儿,发现新发的这些五三是2017版的,而他刷的是2016版的.现在他想找 ...

  5. 20170908校内训练

    题意: 学过博弈论的同学都知道Nim游戏后手必胜的条件是异或和为0 给定一棵树 ,支持修改单点点权,询问链上异或和 预处理每个点到根的路径的异或和 由于异或的特殊性质,在求链x->y的异或和的时 ...

  6. 19_03_26校内训练[魔法卡片]

    题意 有n张有序的卡片,每张卡片上恰有[1,m]中的每一个数,数字写在正面或反面.每次询问区间[l,r],你可以将卡片上下颠倒,问区间中数字在卡片上方的并的平方和最大是多少.q,n*m≤1,000,0 ...

  7. 平面图转对偶图19_03_21校内训练 [Everfeel]

    对于每个平面图,都有唯一一个对偶图与之对应.若G'是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...

  8. 19_05_01校内训练[polygon]

    题意 把一个边长为1的正n边形放到一个正m边形中,要求m边形完全覆盖n边形,可以有交点,并且中心重合.求正m边形的最小边长,至少精确到6位.要求logn计算. 思考 先考虑m|n的情况. 我们知道,正 ...

  9. [3.30校内训练赛]

    来自FallDream的博客,未经允许,请勿转载,谢谢. --------------------------------------------------- ditoly这次打好了虐爆我们的主意, ...

  10. 2017-3-23校内训练

    学长日常出丧题虐人 100+90+64=254/300 T1.数据结构 题目大意:给定n个数,每次给出x和y,询问一个区间内多少数模x等y.(n,询问次数,数字大小<=40000) 思路:用差分 ...

最新文章

  1. 运行时异常 检查时异常
  2. zzz KVC/KVO原理详解及编程指南
  3. 蓝牙BLE LINK LAYER剖析(二) -- PDU
  4. Spring bean 初始化顺序
  5. django安装与简介
  6. 【Java】关于Java编程软件idea快捷键的使用
  7. eclipse.ini 修改默认编码为 UTF-8
  8. 双显卡单独分辨率_显卡预算超低、除了二手,你还可以考虑它、肥猫RX560显卡 评测...
  9. linux两个命令合并,linux合并命令
  10. 博科SAN交换机配置Trunk
  11. IDEA设置字体大小的问题
  12. oracle设置临时表空间,oracle操作临时表空间
  13. matlab中gui对话框,Matlab GUI之通用对话框
  14. 疑犯追踪第一季/全集Person Of Interest迅雷下载
  15. tspl 重置打印机命令_打印机取消任务命令
  16. 使用docker下载搭建TeamCity容器并使用
  17. 进制怎么用计算机算,Win10计算器怎么算二进制,win10计算器二进制使用教程
  18. Vue日历的编写,可显示周和月的模式(其中可以自定义日历里内容的显示)
  19. 新能源智慧路灯充电桩可行性分析
  20. 如何通俗的理解函数的极限_(高等数学笔记)萌新也能理解的函数极限求法

热门文章

  1. zttp php,php常用插件
  2. 【渝粤教育】国家开放大学2018年春季 0579-21T电路及磁路(2)(一) 参考试题
  3. 【渝粤题库】陕西师范大学163212旅游地理学 作业(专升本)
  4. 【渝粤教育】电大中专学前儿童社会教育作业 题库
  5. 数据预处理第7讲:具有离群点数据的缩放方法比较
  6. 23种设计模式(十二)对象性能之享元模式
  7. 车道线检测-python实现
  8. javascript 权威指南一
  9. android studio bug : aidl is missing 解决方案
  10. [翻译]JUnit 5 用户手册