题目:https://www.luogu.org/problemnew/show/P4382

原本想着网络流。不过看了一番题解发现二分图匹配也行。

原本想着第一问也二分,不过看了一番题解发现一档一档地判断就行。不过不知道复杂度是怎样的。

原本想着第二问二分,把后面人的影响去掉的方法是在网络流里断掉源点连向后面人的边。不过看了一番题解发现用二分图匹配,把 n 个图都存下来,二分的时候在对应的图上做就行了。

数据范围小的话真是可以存很多东西来降低复杂度。自己应该拓宽思路。

二分图匹配的时候用 vector 记录每个导师已经匹配了哪些人;再记录该导师战队还剩下多少人(不用专门记也可,用原来的 b[ ] 减去 vector 的 size 即可),就能增广了。

重新认识了匈牙利算法。每次给对面的点打 vis 标记也是为了不让增广路径上的点匹配回原来的选择。

注意换导师的匹配的时候要把这个人从 vector 里删掉。用了那种 erase + remove 的方法。这个操作其实是线性的吧?感觉复杂度全靠信仰。不过竟然还跑得很快。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
#define it per[cs[cr]]
using namespace std;
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
const int N=205,M=15;
int n,m,s[N]; bool vis[N];
int a[N][N][M],len[N][N];
struct Gra{int b[N],c[N],cs[N];vector<int> per[N];bool xyl(int cr,int nw){for(int i=1,v;i<=len[cr][nw];i++)if(!vis[v=a[cr][nw][i]]){vis[v]=1;if(b[v]){if(cs[cr]){b[cs[cr]]++;//
        it.erase(remove(it.begin(),it.end(),cr));//
          }b[v]--;per[v].pb(cr);cs[cr]=v; c[cr]=nw; return true;}for(int j=0,lm=per[v].size();j<lm;j++)if(xyl(per[v][j],c[per[v][j]])){if(cs[cr]){b[cs[cr]]++;it.erase(remove(it.begin(),it.end(),cr));//
        }b[v]--;per[v].pb(cr);cs[cr]=v; c[cr]=nw; return true;}}return false;}void solve(int cr){for(int i=1,lm;i<=m;i++)if(len[cr][i]){memset(vis,0,sizeof vis);if(xyl(cr,i))break;}if(!c[cr])c[cr]=m+1;}
}g[N],f;
bool chk(int cr,int mid)
{f=g[cr-mid-1];for(int i=1;i<=s[cr];i++){memset(vis,0,sizeof vis);//
      if(f.xyl(cr,i))return true;}return false;
}
int main()
{int T=rdn(),C=rdn();while(T--){memset(len,0,sizeof len);n=rdn();m=rdn();for(int i=1;i<=m;i++)g[0].b[i]=rdn();for(int i=1,d;i<=n;i++)for(int j=1;j<=m;j++){d=rdn();if(d)a[i][d][++len[i][d]]=j;}for(int i=1;i<=n;i++)s[i]=rdn();for(int i=1;i<=n;i++){ g[i]=g[i-1]; g[i].solve(i);}for(int i=1;i<=n;i++)printf("%d ",g[i].c[i]);puts("");for(int i=1;i<=n;i++){if(g[i].c[i]<=s[i]){printf("0 ");continue;}int l=1,r=i-1,ret=i;while(l<=r){int mid=l+r>>1;if(chk(i,mid))ret=mid,r=mid-1;else l=mid+1;}printf("%d ",ret);}puts("");}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10572201.html

洛谷 4382 [八省联考2018]劈配——二分图匹配相关推荐

  1. [八省联考2018]劈配

    [八省联考2018]劈配 并不难的一道题,甚至比一双木棋还容易一些 关键点就是一个:怎么处理"最优结果",即总体字典序最小 显然要反悔.匹配问题反悔套路就多了 法一: 变形匈牙利算 ...

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

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

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

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

  4. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  5. 洛谷P4383 [八省联考2018]林克卡特树

    题目描述 题解 题目可以转化一下,就是要在原树中选出 k+1k+1k+1 条不相交的链使得其权值和最大. 考虑暴力 dp\text{dp}dp : f[u][i][0/1/2]f[u][i][0/1/ ...

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

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

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

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

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

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

  9. 洛谷 4364 [九省联考2018]IIIDX——“预留”的思路

    题目:https://www.luogu.org/problemnew/show/P4364 原来想了一个错误的思路,就是这样: solve( cr , l , r ) 表示 cr 为根的子树填 [ ...

最新文章

  1. HDU 6156 Palindrome Function 数位DP
  2. android p获取通话记录_HBuilder 获取通话记录 (Android)
  3. 软件项目质量保证——编码规范
  4. python 不同集合上元素的迭代 chain()
  5. 动态让控件超出屏幕_JAVA浏览器控件JxBrowser v7.5上线!更轻松处理Dynamic Favicons...
  6. opengl加载显示3D模型ase类型文件
  7. java 1.8新增功能_Java 8的新增功能(第二部分-可能会出现什么)
  8. c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现
  9. futuretask java 并发请求_Java并发机制(9)--Callable、Future、FutureTask的使用
  10. access denied (java.io.FilePermission IKAnalyzer.cfg.xml read
  11. css3探测光圈_一款带光圈阴影的纯CSS3 Instagram图标
  12. 【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙
  13. PXE配置-Tftpd64
  14. python excel画图_利用python在excel中画图的实现方法
  15. 第一台电子计算机乌拉尔,2018网易爱乐之战题目答案大全一览
  16. 水星mw325r设置无线服务器未响应,水星MW325R无线路由器设置教程
  17. Java 基于JavaMail实现向QQ邮箱发送邮件(未测试)
  18. 更加安全便捷的印章管理——区块链电子印章
  19. openCV+VS2010结合+正确运行图片
  20. js 实现批量下载页面中的图片

热门文章

  1. C#命名空间详解namespace
  2. 机器学习---学习首页
  3. 参与制定H.266标准的公司
  4. Hadoop集群搭建安装教程(续集)高可用(HA)
  5. 编程命名规则:驼峰命名法和匈牙利命名法
  6. lg手机历史机型_LG手机兵败国内市场 它的这些经典机型你用过哪款?
  7. 用APPLET显示图片
  8. 码分多址CDMA通信
  9. 首次公开!策略协作型AI「绝悟」王者荣耀内开放体验,限时4天
  10. Zoom burst(变焦爆裂/变焦爆炸)