【纪中集训2019.3.23】Deadline
题意
描述
一个二分图\((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的更多相关文章
- 【纪中集训2019.3.23】IOer
题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...
- 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)
题目 描述 \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...
- 【纪中集训2019.3.12】Mas的仙人掌
题意: 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...
- 【纪中集训2019.3.11】Cubelia
题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...
- 【纪中集训2019.3.13】fft
题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...
- 【纪中集训2019.3.12】Z的礼物
题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...
- 「中山纪中集训省选组D1T1」最大收益 贪心
题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...
- 纪中集训 Day 2
今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...
- 纪中集训 Day1
今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...
随机推荐
- 如何解决zabbix snmp异常超时、不稳定、时通时断:Timeout
针对平时工作中,zabbix snmp出现异常超时.不稳定.时通时断:Timeout while connecting 等的情况,以下我将以使用乐维监控为例,进行解决方案的详细叙述. 一.问题:设 ...
- DDMS_Threads的简单使用
title: DDMS_Threads的简单使用 date: 2016-07-20 00:44:35 tags: [DDMS] categories: [Tool,IDE] --- 概述 本文记录在 ...
- 从汉诺塔游戏理解python递归函数
汉诺塔游戏规则: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 图 ...
- 四则运算App--大总结(已完成)
1. 贡献分分配(20分) 欧泽波:14分,Android的学习,代码的编写,等等 杨洁华:1分,提供学习资料,框架的设计等等 赵泽嘉:3分,提供学习资料,框架的设计等等 林扬滨:2分,提供学习资料, ...
- 【CS231N】7、卷积神经网络
一.疑问 1. assignments2 在代码文件FullyConnectedNets.ipynd 中,有代码如下: # Test the affine_forward function num_i ...
- Visual Studio 中配置openCV问题
1. 首先强调一点:VS与openCV的版本对应问题,一般而言,openCV对于VS采用向下的支持方式: vc6 -> VS6.0 vc7.0 -> VS2002 vc7.1 -> ...
- [并查集] 1118. Birds in Forest (25)
1118. Birds in Forest (25) Some scientists took pictures of thousands of birds in a forest. Assume t ...
- 深入理解JAVA I/O系列三:字符流详解
字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节 ...
- Redis内存回收:LRU算法
Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...
- Scrum6.0
一,组员任务完成情况 首页设计初步完成但是需要优化界面,只能简单的输出信息和在首页进行登录.界面极其简单. 鸡汤版面设计有困难,问题在于用何种形式来管理用户的数据上传,但是经过小组间的讨论确定设计方向 ...