题解:每次加入两个点,对于和为平方数的两个值所对应的点建边,反正网络流可以跑残量网络,所以就没有什么关系了……

代码如下:

  1. #include<cmath>
  2. #include<queue>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define inf 0x3f3f3f3f
  8. using namespace std;
  9. int head[],next[],w[],v[],deep[];
  10. int s,t,cnt;
  11. void init()
  12. {
  13. cnt=-;
  14. memset(head,-,sizeof(head));
  15. memset(next,-,sizeof(next));
  16. }
  17. void add(int from,int to,int cost)
  18. {
  19. cnt++;
  20. next[cnt]=head[from];
  21. w[cnt]=cost;
  22. v[cnt]=to;
  23. head[from]=cnt;
  24. }
  25. void add_edge(int from,int to,int cost)
  26. {
  27. add(from,to,cost);
  28. add(to,from,);
  29. }
  30. int bfs(int s,int t)
  31. {
  32. queue<int> q;
  33. memset(deep,,sizeof(deep));
  34. deep[s]=;
  35. q.push(s);
  36. while(!q.empty())
  37. {
  38. int u=q.front();
  39. q.pop();
  40. for(int i=head[u]; i!=-; i=next[i])
  41. {
  42. if(!deep[v[i]]&&w[i]>)
  43. {
  44. deep[v[i]]=deep[u]+;
  45. q.push(v[i]);
  46. }
  47. }
  48. }
  49. if(!deep[t])
  50. {
  51. return ;
  52. }
  53. return ;
  54. }
  55. int dfs(int u,int t,int dist)
  56. {
  57. if(u==t)
  58. {
  59. return dist;
  60. }
  61. for(int i=head[u]; i!=-; i=next[i])
  62. {
  63. if(w[i]&&(deep[u]+==deep[v[i]]))
  64. {
  65. int di=dfs(v[i],t,min(w[i],dist));
  66. if(di>)
  67. {
  68. w[i]-=di;
  69. w[i^]=di;
  70. return di;
  71. }
  72. }
  73. }
  74. return ;
  75. }
  76. int dinic(int s,int t)
  77. {
  78. int ans=;
  79. while(bfs(s,t))
  80. {
  81. while(int d=dfs(s,t,inf))
  82. {
  83. ans+=d;
  84. }
  85. }
  86. return ans; //
  87. }
  88. int id[],wid[],vis[];
  89. void solve(int x,int &f)
  90. {
  91. int loc=wid[x];
  92. vis[x]=;
  93. for(int i=head[loc]; i!=-; i=next[i])
  94. {
  95. if(w[i]==&&v[i]!=t)
  96. {
  97. solve(v[i]/,f);
  98. }
  99. }
  100. if(f==)
  101. {
  102. f=;
  103. }
  104. else
  105. {
  106. putchar(' ');
  107. }
  108. printf("%d",x);
  109. }
  110. int main()
  111. {
  112. init();
  113. int n;
  114. scanf("%d",&n);
  115. s=;
  116. t=;
  117. int i,tmp=,ans=,tmp2=;
  118. for(i=; i-ans<=n+; i++)
  119. {
  120. id[i]=tmp++;
  121. wid[i]=tmp++;
  122. add_edge(s,id[i],);
  123. add_edge(wid[i],t,);
  124. for(int j=; j<i; j++)
  125. {
  126. int tmp1=sqrt(i+j);
  127. if(tmp1*tmp1==i+j)
  128. {
  129. add_edge(id[j],wid[i],);
  130. }
  131. }
  132. ans+=dinic(s,t);
  133. }
  134. tmp2=i-;
  135. printf("%d\n",tmp2);
  136. for(int i=head[t]; i!=-; i=next[i])
  137. {
  138. if(w[i]==&&!vis[v[i]/])
  139. {
  140. int f=;
  141. solve(v[i]/,f);
  142. puts("");
  143. }
  144. }
  145. for(int i=; i<=tmp2; i++)
  146. {
  147. if(!vis[i])
  148. {
  149. printf("%d\n",i);
  150. }
  151. }
  152. }

LibreOJ 6003 魔术球 (最大流)的更多相关文章

  1. Libre 6003 「网络流 24 题」魔术球 (网络流,最大流)

    Libre 6003 「网络流 24 题」魔术球 (网络流,最大流) Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只 ...

  2. LibreOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

    6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  3. [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

    #6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  4. 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)

    P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...

  5. cogs_396_魔术球问题_(最小路径覆盖+二分图匹配,网络流24题#4)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i ...

  6. P2765 魔术球问题 网络流二十四题重温

    P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们 ...

  7. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  8. P2765 魔术球问题

    P2765 魔术球问题 贪心模拟就可以过.........好像和dinic没啥关系   找找规律发现可以贪心放.n又灰常小. 设答案=m 你可以$O(mn)$直接模拟过去 闲的慌得话可以像我用个$se ...

  9. 洛谷 P2765 魔术球问题 解题报告

    P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...

随机推荐

  1. POI 单元格

    OI 单元格合并中的CellRangeAddress 参数: CellRangeAddress(int, int, int, int) 参数:起始行号,终止行号, 起始列号,终止列号 sheet.ad ...

  2. TCP报文送达确认ACK

    TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号.一个TCP数据包中包含多个字节 ...

  3. java练习,,,从键盘输入次数,输出最大值,和

    总结:你的关注,是我的动力 package com.b; import java.util.Scanner; public class YUIO { public static void main(S ...

  4. 乘积最大(线性dp)

    乘积最大 时间限制: 1 Sec  内存限制: 128 MB提交: 4  解决: 4[提交][状态][讨论版][命题人:quanxing] 题目描述 今年是国际数学联盟确定的“2000——世界数学年” ...

  5. JAVA基础知识——IO

    首先看一下JAVA IO的类继承关系

  6. 委托小结及Func用法

    首先,委托是一种类型,由关键字delegate声明.确切的说,委托是一种可用于封装命名或者匿名方法的引用类型.  它类似于 C++ 中的函数指针,而且是类型安全和可靠的.       委托类型的声明与 ...

  7. EasyUI应用总结

    1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncod ...

  8. Directshow 采集音视频数据H264+AAC+rtmp效果还不错

    从usb摄像头或者采集卡中采集效果还是不错的.

  9. CasperJs 入门介绍

    CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation. 1.安装 CasperJS 依赖于 PhantomJS >= 1 ...

  10. codeforce452DIV2——F. Letters Removing

    题意:给一个字符串和m个操作,每次给出l,r,c,把字符串中l-r这段区间的字符为c的字符删掉,求最后的字符串.(n,m<=2e5)线段树.注意这个区间修改和普通区间修改的区别. 他们都是用树状 ...