考虑依次选择每一位考生,设当前选到第$i+1$位,前i个分别为$p1,p2,……pi$(注意:这里只确定了导师的志愿编号),然后枚举第$p_{i+1}$,通过网络流建图+判定,复杂度为$o(nm*f(n+m,cn))$($f(n,m)$表示点数为n、边数为m的网络流),无法通过
考虑优化,由于网络流可以先任意流,那么直接在之前的残余网络上加上第k份志愿并判断能否联通即可,复杂度$o(cn^{2}m)$
第二个问题类似,存储下每一次跑完后的残余网络,然后从下往上枚举其排名(志愿为si及其以上的)并建图,复杂度同样为$o(cn^{2}m)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 205
4 struct ji{
5 int nex,to,len;
6 }edge[30*N],e[N][30*N];
7 vector<int>v[N][N];
8 int E,t,n,m,x,EE[N],head[N<<1],vis[N<<1],h[N][N<<1];
9 void add(int x,int y,int z){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 edge[E].len=z;
13 head[x]=E++;
14 }
15 bool dfs(int k){
16 if (k==n+m+1)return 1;
17 if (vis[k])return 0;
18 vis[k]=1;
19 for(int i=head[k];i!=-1;i=edge[i].nex)
20 if ((edge[i].len)&&(dfs(edge[i].to))){
21 edge[i].len--;
22 edge[i^1].len++;
23 return 1;
24 }
25 return 0;
26 }
27 int main(){
28 scanf("%d%*d",&t);
29 while (t--){
30 scanf("%d%d",&n,&m);
31 E=0;
32 memset(head,-1,sizeof(head));
33 for(int i=1;i<=n;i++)
34 for(int j=1;j<=m;j++)v[i][j].clear();
35 for(int i=1;i<=m;i++){
36 scanf("%d",&x);
37 add(i+n,n+m+1,x);
38 add(n+m+1,i+n,0);
39 }
40 for(int i=1;i<=n;i++)
41 for(int j=1;j<=m;j++){
42 scanf("%d",&x);
43 if (x)v[i][x].push_back(j);
44 }
45 EE[0]=E;
46 memcpy(h[0],head,sizeof(head));
47 memcpy(e[0],edge,sizeof(edge));
48 for(int i=1;i<=n;i++){
49 bool flag=0;
50 EE[i]=E;
51 memcpy(h[i],head,sizeof(head));
52 memcpy(e[i],edge,sizeof(edge));
53 for(int j=1;j<=m;j++){
54 E=EE[i];
55 memset(vis,0,sizeof(vis));
56 memcpy(head,h[i],sizeof(head));
57 memcpy(edge,e[i],sizeof(edge));
58 for(int k=0;k<v[i][j].size();k++){
59 add(i,v[i][j][k]+n,1);
60 add(v[i][j][k]+n,i,0);
61 }
62 if (dfs(i)){
63 flag=1;
64 printf("%d ",j);
65 break;
66 }
67 }
68 if (!flag)printf("%d ",m+1);
69 EE[i]=E;
70 memcpy(h[i],head,sizeof(head));
71 memcpy(e[i],edge,sizeof(edge));
72 }
73 printf("\n");
74 for(int i=1;i<=n;i++){
75 scanf("%d",&x);
76 bool flag=0;
77 for(int j=i;j;j--){
78 E=EE[j-1];
79 memset(vis,0,sizeof(vis));
80 memcpy(head,h[j-1],sizeof(head));
81 memcpy(edge,e[j-1],sizeof(edge));
82 for(int k=1;k<=x;k++)
83 for(int l=0;l<v[i][k].size();l++){
84 add(i,v[i][k][l]+n,1);
85 add(v[i][k][l]+n,i,0);
86 }
87 if (dfs(i)){
88 flag=1;
89 printf("%d ",i-j);
90 break;
91 }
92 }
93 if (!flag)printf("%d ",i);
94 }
95 printf("\n");
96 }
97 }

[loj2477]劈配的更多相关文章

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

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

  2. 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)

    [BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...

  3. [BZOJ5251][九省联考2018]劈配(网络流)

    5251: [2018多省省队联测]劈配 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 33  Solved: 22[Submit][Status][ ...

  4. [BZOJ5251][多省联测2018]劈配

    bzoj luogu sol 从前往后依次加边,每次对一个人做完劈配后就把当前这个残余网络存下来.这样第二问就可以二分排在第几名然后check一下在对应排名的残余网络上还能不能再增广. 给网络流开结构 ...

  5. [八省联考2018] 劈配 mentor

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

  6. bzoj 5251: [2018多省省队联测]劈配

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

  7. bzoj5251 [2018多省省队联测]劈配

    直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...

  8. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  9. BZOJ.5251.[八省联考2018]劈配mentor(最大流)

    BZOJ 洛谷 对于每个人,每次枚举一个志愿看是否能增广即可. 对于第二问,可以保留第一问中\(n\)次增广前后的\(n\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...

随机推荐

  1. mybatis-plus最新版代码生成器(Swagger3)

    写项目想用mybatis-plus+swagger3,百度最新版代码生成器都是旧版的,且官网的配置过于简洁,所以手敲一份,在官网的基础上加了一堆配置,lombok,restful,mvc三层结构目录等 ...

  2. 密码学系列之:加密货币中的scrypt算法

    目录 简介 scrypt算法 scrypt算法详解 scrypt的使用 简介 为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合.但是这些算法逐渐被一些特 ...

  3. Java初步学习——2021.10.05每日总结,第五周周二

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了二维数组,包括二维数组的声明,和二维数组的创建.以及获取二维数组的长度,其中要注意的是二维数组是每个元素都是一维数 ...

  4. 前端面试题之手写promise

    前端面试题之Promise问题 前言 在我们日常开发中会遇到很多异步的情况,比如涉及到 网络请求(ajax,axios等),定时器这些,对于这些异步操作我们如果需要拿到他们操作后的结果,就需要使用到回 ...

  5. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  6. 264.丑数II

    题目 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例 1: 输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, ...

  7. Python爬虫:给我一个链接,快手视频随便下载

    前言 讲一下,文明爬虫,从我做起(1.文章中的程序代码仅供学习,切莫用于商业活动,一经被相关人员发现,本小编概不负责!2.请在服务器闲时运行本程序代码,以免对服务器造成很大的负担.) 1. 实现原理 ...

  8. AtCoder Beginner Contest 223

    AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B - String Shifting 思路分析 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也 ...

  9. [敏捷软工团队博客]Beta阶段项目展示

    团队成员简介和个人博客地址 头像 姓名 博客园名称 自我介绍 PM 测试 前端 后端 dzx 秃头院的大闸蟹 大闸蟹是1706菜市场里无菜可卖的底层水货.大闸蟹喜欢音乐(但可惜不会),喜欢lol(可惜 ...

  10. 热身训练1 Game

    http://acm.hdu.edu.cn/showproblem.php?pid=5242 简要题意: 一棵树有n个节点,每个节点x有一个权值wi,我们要从根节点出发(不可回头),去收集每个节点的权 ...