题目大意

有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对。给你一些书和练习册,书和答案的可能的配对关系。问你最多可以配成多少套完整的书册。

解题思路

我已开始直接建立超级源点汇点,然后源点$\rightarrow $练习册连边,练习册$\rightarrow $书连边,书$\rightarrow $答案连边,答案$\rightarrow $汇点连边。然后直接跑 $\text{Dinic}$。$\text{RE}$ 了之后 $\text{TLE}$ 了。后来发现如果「 书 」这个环节不进行拆点的话,会有部分练习册和答案共用一本书。这样就错了。又加了拆点的过程。还是 $\text{TLE}$。又发现是我的$\text{Dinic}$ 写的太丑,每次增广只能增广 $1$ 。简直了,又去题解,里找了个写的好看的 $\text{Dinic}$ 重新搞了一线板子,这才过了这道题。

附上代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. using namespace std;
  6. const int maxn = 8e6+, INF = ;
  7. int n1, n2, n3, s, t, m, head[maxn], cnt = , Depth[maxn], Ans;
  8. struct edge {
  9. int v, w, nxt;
  10. }ed[maxn];
  11. inline int read() {
  12. int x = , f = ; char c = getchar();
  13. while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  14. while (c <= '' && c >= '') {x = x* + c-''; c = getchar();}
  15. return x * f;
  16. }
  17. inline void addedge (int x, int y, int z) {
  18. ed[++cnt].nxt = head[x];
  19. ed[cnt].v = y, ed[cnt].w = z;
  20. head[x] = cnt;
  21. }
  22. inline bool bfs() {
  23. queue<int> Q;
  24. memset(Depth, , sizeof(Depth));
  25. Q.push(s), Depth[s] = ;
  26. int u;
  27. while (!Q.empty()) {
  28. u = Q.front();
  29. Q.pop();
  30. for(int i=head[u]; i; i=ed[i].nxt) {
  31. if(ed[i].w > && !Depth[ed[i].v]) {
  32. Depth[ed[i].v] = Depth[u] + ;
  33. Q.push(ed[i].v);
  34. if(ed[i].v == t) return true;
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40. inline int Dinic(int u, int cap) {
  41. if(u == t || !cap) return cap;
  42. int delta, ret = ;
  43. for(int i=head[u]; i; i=ed[i].nxt) {
  44. if(ed[i].w > && Depth[ed[i].v] == Depth[u] + ) {
  45. delta = Dinic(ed[i].v, min(ed[i].w, cap-ret));
  46. if(delta > ) {
  47. ed[i].w -= delta;
  48. ed[i^].w += delta;
  49. ret += delta;
  50. }
  51. }
  52. }
  53. return ret;
  54. }
  55. int main() {
  56. n1 = read(), n2 = read(), n3 = read();
  57. s = , t = n1*+n2+n3+;
  58. for(int i=n1*+; i<=n1*+n2; i++)
  59. addedge(s, i, ), addedge(i, s, );
  60. for(int i=n1*+n2+; i<=n1*+n2+n3; i++)
  61. addedge(i, t, ), addedge(t, i, );
  62. scanf("%d", &m);
  63. int x, y;
  64. for(int i=; i<=m; i++) {
  65. scanf("%d%d", &x, &y);
  66. addedge(y+n1*, x, ), addedge(x, y+n1*, );
  67. }
  68. scanf("%d", &m);
  69. for(int i=; i<=m; i++) {
  70. scanf("%d%d", &x, &y);
  71. addedge(x+n1, y+n1*+n2, ), addedge(y+n1*+n2, x+n1, );
  72. }
  73. for(int i=; i<=n1; i++) {
  74. addedge(i, i+n1, ), addedge(i+n1, i, );
  75. }
  76. while (bfs()) Ans += Dinic(s, INF);
  77. printf("%d", Ans);
  78. }

「 Luogu P1231 」 教辅的组成的更多相关文章

  1. 「洛谷P1231」教辅的组成 解题报告

    P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...

  2. 「Luogu 1525」关押罪犯

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...

  3. 「Luogu 2367」语文成绩

    更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...

  4. 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party

    更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...

  5. 「Luogu 1349」广义斐波那契数列

    更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...

  6. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  7. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  8. 「Luogu P2201」数列编辑器 解题报告

    数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我

  9. 「Luogu 1471」 方差

    题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 输入输出 ...

随机推荐

  1. redis 的部分配置

    linux 安装: yum install redis 修改redis配置: 配置文件位于/etc/redis.conf. 作为守护进程运行(默认no) # 默认情况下 redis 不是作为守护进程运 ...

  2. SQL Server: Difference between PARTITION BY and GROUP BY

    https://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by ...

  3. nestedScrollview 嵌套使用recyclerview判断滑动到底部 (嵌套滑动导致 不能使用recyclerview的onscrolled监听)

    NestedScrollView scroller = (NestedScrollView) findViewById(R.id.myScroll); if (scroller != null) { ...

  4. 10.07 WZZX Day2总结

    今天仍然是KCZ出题.今天才知道KCZ不仅是WZ地区史上最强选手而且还是ZJ队长?在ZJOI拿到Rank1的男人?%%%%% 今天KCZ出题的依然很强势…… T1.wzoi 期望得分20-100 实际 ...

  5. 解决 2003 Can’t connect to MySQL server on ‘localhost’ (10048)

    2003 Can’t connect to MySQL server on ‘localhost’ (10048)一般见于使用mysql的windows 2003服务器.错误的出现的原因: 第一种原因 ...

  6. js几种escape()解码与unescape()编码

    js几种escape()解码与unescape()编码 www.111cn.net 编辑:kepeer 来源:转载 一篇js几种escape()解码与unescape()编码函数,同时我们也和它和服务 ...

  7. 8 种提升ASP.NET Web API性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  8. SQL Server 添加描述

    添加描述的格式 exec sys.sp_addextendedproperty @name = N'MS_Description' ,@value = 'value',@level0type=N'SC ...

  9. java 实现word文档在线预览

    一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...

  10. [C陷阱和缺陷] 第6章 预处理器

      在严格意义上的编译过程开始之前,C语言预处理器首先对程序代码作了必要的转换处理.因此,我们运行的程序实际上并不是我们所写的程序.预处理器使得编程者可以简化某些工作,它的重要性可以由两个主要的原因说 ...