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

    (1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 学习数组,编写了一个随机选牌的代码.自己最开始一直想只设置一个字符串数组,利用随机数来输出,但那样对字符串赋值会比较麻烦.可 ...

  2. Java读取属性配置文件-properties

    在项目开发中,我们难免将一些可变的参数放在程序以外,作为一个单独的文件,即配置文件,这样方便项目在不同的使用环境部署时.或者说需要不同时,可以通过简单配置这些程序以外的文件来修改程序里的变量. 常用的 ...

  3. 用css写三角形

    html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...

  4. jdbc简单学生管理系统

    这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...

  5. Beta版本发布计划

    Beta版本新功能 小程序v2.0新功能 新功能列表 页面 新功能描述 图片涂鸦页 增加了马赛克方块形式的涂鸦,同样支持撤销和保存 图片裁切页 增加了图片裁切功能,实现对目标图片的尺寸进行裁切 编辑图 ...

  6. 第0次 Beta Scrum Meeting

    本次会议为Beta阶段第0次Scrum Meeting会议 会议概要 会议时间:2021年5月27日 会议地点:「腾讯会议」线上进行 会议时长:1小时 会议内容简介:本次会议为Beta阶段启程会议,主 ...

  7. .net,C#,Vb,F#,Asp,Asp.net区别以及作用和方向

    .net是平台,其他都是运行在其.NET FrameWork环境下的 C#,Vb都是语言运行在.net 平台下 Asp,Asp.net 都是用来写Web网页的,但是Asp和Asp.net有区别 Asp ...

  8. Noip模拟8 2021.6.17

    T1 星际旅行 仔细一看,发现像一个欧拉路(简称一笔画). 满足"可以一笔画"的条件是: 1.所有点都有偶数条连边; 2.有偶数个点连奇数条边; 满足以上两个条件的任意一个即可一笔 ...

  9. 2021.9.7考试总结[NOIP模拟49]

    T1 Reverse $BFS$暴力$O(n^2)$ 过程中重复枚举了很多点,考虑用链表记录当前点后面可到达的第一个未更新点. 搜索时枚举翻转子串的左端点,之后便可以算出翻转后$1$的位置. $cod ...

  10. 设计模式(1-2)-动态代理(newProxyInstance)

    上节设计模式(1-1)-代理模式,讲了代理模式的静态代理与动态代理的写法.本节,会从Proxy.newProxyInstance() 这个方法开始讲,上一节文末的那个class文件怎么一步步的来的. ...