[八省联考2018]劈配

并不难的一道题,甚至比一双木棋还容易一些

关键点就是一个:怎么处理“最优结果”,即总体字典序最小

显然要反悔。匹配问题反悔套路就多了

法一:

变形匈牙利算法

记录右部点导师的战队情况

枚举每个人,枚举每一层进行尝试匹配

最多把前面的人的边都遍历到,总共O(n*n*c)

第二问

显然二分

第一问时候存图即可

技巧:

n,m很小,充分利用桶和计数器,可以不带set等logn结构,也不用vector(防止卡常)

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{
const int N=201;
int n,m,C;
int vis[N];
int con[N][N];
int to[N][N][N],cnt[N][N];
int b[N],mem[N][N],p[N];//teacher
int s[N];
int c[N];//ans1
struct node{int mem[N][N],p[N];
}tim[N];
bool dfs(int x,int d,int st){for(reg i=1;i<=cnt[x][d];++i){int y=to[x][d][i];if(vis[y]==st) continue;vis[y]=st;if(p[y]<b[y]){mem[y][++p[y]]=x;return true;}else{for(reg j=1;j<=b[y];++j){if(dfs(mem[y][j],c[mem[y][j]],st)){mem[y][j]=x;return true;}}}}return false;
}
void wrk1(){for(reg i=1;i<=n;++i){c[i]=m+1;memset(vis,0,sizeof vis);for(reg j=1;j<=m;++j){if(cnt[i][j]==0) continue;if(dfs(i,j,j)){c[i]=j;break;}}memcpy(tim[i].mem,mem,sizeof mem);memcpy(tim[i].p,p,sizeof p);}
}
bool fin(int x,int d,int t,int st){for(reg i=1;i<=cnt[x][d];++i){int y=to[x][d][i];if(vis[y]==st) continue;vis[y]=st;if(tim[t].p[y]<b[y]){return true;}else{for(reg j=1;j<=b[y];++j){if(fin(tim[t].mem[y][j],c[tim[t].mem[y][j]],t,st)){return true;}}}}return false;
}
bool che(int x,int t){memset(vis,0,sizeof vis);for(reg j=1;j<=s[x];++j){if(cnt[x][j]==0) continue;if(fin(x,j,t,j)) return true;}return false;
}
int ans[N];
void wrk2(){for(reg i=1;i<=n;++i){if(c[i]<=s[i]) {ans[i]=0;continue;}int l=0,r=i-2;int ok=-1;while(l<=r){int mid=(l+r)/2;if(che(i,mid)){ok=mid;l=mid+1;}else r=mid-1;}ans[i]=i-ok-1;}
}
void clear(){memset(ans,0,sizeof ans);memset(cnt,0,sizeof cnt);memset(p,0,sizeof p);
}
int main(){int t;rd(t);rd(C);    while(t--){clear();rd(n);rd(m);for(reg i=1;i<=m;++i) rd(b[i]);for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){rd(con[i][j]);to[i][con[i][j]][++cnt[i][con[i][j]]]=j;}}for(reg i=1;i<=n;++i){rd(s[i]);}wrk1();
//        cout<<"hahaha "<<endl;for(reg i=1;i<=n;++i){printf("%d ",c[i]);}puts("");wrk2();for(reg i=1;i<=n;++i){printf("%d ",ans[i]);}puts("");
//        cout<<" hahaah"<<endl;
    }return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/3/25 17:52:55
*/

View Code

法二:

动态加边dinic最大流

第一问就是把匈牙利变成dinic,据说要把匹配失败的边删除防止TLE

第二问:

二分。用vector存第一问每次图的边

一次性把前s[i]个边都加入,跑dinic

技巧:

删除的话,只用vector.pop_back即可。其他的边,由于找不到增广路,所以依然流量守恒的

题面很长,实际不难

就是考察一个匹配的反悔机制了

暴力分还很多、、、

转载于:https://www.cnblogs.com/Miracevin/p/10595837.html

[八省联考2018]劈配相关推荐

  1. BZOJ5251 八省联考2018劈配(网络流)

    劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...

  2. [八省联考2018]劈配 (匈牙利)

    description 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 轻车熟路的 Zayid 顺利 ...

  3. 洛谷 4382 [八省联考2018]劈配——二分图匹配

    题目:https://www.luogu.org/problemnew/show/P4382 原本想着网络流.不过看了一番题解发现二分图匹配也行. 原本想着第一问也二分,不过看了一番题解发现一档一档地 ...

  4. BZOJ5251:[九省联考2018]劈配——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477  <-可以看数据 https: ...

  5. LuoguP4383 [八省联考2018]林克卡特树lct

    LuoguP4383 [八省联考2018]林克卡特树lct https://www.luogu.org/problemnew/show/P4383 分析: 题意等价于选择\(K\)条点不相交的链,使得 ...

  6. luogu4383 bzoj5252[八省联考2018]林克卡特树lct

    ** [八省联考2018]林克卡特树lct** luogu bzoj 分析 很神仙的一道wqs二分.是真的不会切>-< 如果已经切完了,最优秀的方案就是每个联通块搞直径然后连起来一定是最优 ...

  7. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  8. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做"LC ...

  9. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-103逆序排列
  2. 数字图像处理实验(12):PROJECT 05-03,Periodic Noise Reduction Using a Notch Filter
  3. 如何快速完成整理笔记?
  4. .Net(C#)自定义WinForm控件之小结篇(强力推荐)
  5. linux系列(十六):which命令
  6. aptana studio 汉化与安装 zencoding、spket 配置
  7. 综合布线故障排除和诊断—DSX-600
  8. APIGEE:用于API代理的CI / CD管道
  9. python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...
  10. linux 发送http请求方式
  11. cmd如何默认以管理身份运行
  12. 2019福布斯中国富豪榜发布:马云蝉联榜首 王健林排名跌至第14位
  13. 高性能 Go 日志库 zap 设计与实现
  14. 2019-04-01
  15. php集成环境安装包网盘,php环境集成安装包下载|php5环境集成安装包正式版_ - 极光下载站...
  16. 离散数学_命题逻辑_部分习题
  17. android Q版本START_ACTIVITIES_FROM_BACKGROUND
  18. 近5年内有关病毒在复杂网络中传播与控制方面的20篇论文
  19. route命令添加永久路由
  20. 抖音小程序实践四:实现小程序分享

热门文章

  1. 9.STM32中对SysTick_Init()函数(sysTick_Config()、TimingDelay_Decrement()自定义)和Delay_us()的理解
  2. Nanopi NEO Air串口代码
  3. springmvc二十三:日期格式化
  4. 高可用flume-ng搭建
  5. 【递推DP】POJ1163The Triangle
  6. 解决QT出现XXXX.dll不能加载问题
  7. 格式化大容量硬盘为fat32
  8. jdbc.properties 配置
  9. 基于 Nginx XSendfile + SpringMVC 进行文件下载
  10. hibernate建表 一对多 多的一方控制一的一方