【网络流24题】魔术球问题(最大流)

题面

Cogs

题解

是不是像极了最小路径覆盖?
因此,我们枚举放到哪一个球(也可以二分)
然后类似于最小路径覆盖的连边

因为一根柱子对应一个路径的覆盖
所以,提前预处理所有可行的连边(单向边,强制从小向大)
然后不断更新答案求最小路径覆盖即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAXL 500000
#define MAX 6000
#define INF 1000000000
inline int read()
{int x=0,t=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
struct Line
{int v,next,w;
}e[MAXL];
int h[MAX],cnt;
int S,T,n,m,K;
inline void Add(int u,int v,int w)
{e[cnt]=(Line){v,h[u],w};h[u]=cnt++;e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
}
int level[MAX];
bool BFS()
{memset(level,0,sizeof(level));level[S]=1;queue<int> Q;Q.push(S);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=h[u];i!=-1;i=e[i].next){int v=e[i].v;if(e[i].w&&!level[v])level[v]=level[u]+1,Q.push(v);}}return level[T];
}
int DFS(int u,int flow)
{if(flow==0||u==T)return flow;int ret=0;for(int i=h[u];i!=-1;i=e[i].next){int v=e[i].v;if(e[i].w&&level[v]==level[u]+1){int dd=DFS(v,min(flow,e[i].w));flow-=dd;ret+=dd;e[i].w-=dd;e[i^1].w+=dd;}}return ret;
}
int Dinic()
{int ret=0;while(BFS())ret+=DFS(S,INF);return ret;
}
vector<int> lk[MAX];
bool issqr(int x){int k=sqrt(x);return k*k==x;}
void Pre()
{for(int i=1;i<=1600;++i)for(int j=i+1;j<=1600;++j)if(issqr(i+j))lk[i].push_back(j);
}
void Linkedge(int k)
{memset(h,-1,sizeof(h));cnt=0;for(int i=1;i<=k;++i)for(int j=0;j<lk[i].size()&&lk[i][j]<=k;++j)Add(i,lk[i][j]+1600,1);for(int i=1;i<=k;++i)Add(S,i,1);for(int i=1;i<=k;++i)Add(i+1600,T,1);
}
int main()
{freopen("balla.in","r",stdin);freopen("balla.out","w",stdout);n=read();S=0;T=5000;Pre();for(int i=1;;i++){Linkedge(i);if(i-Dinic()>n){printf("%d\n",i-1);break;}}return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8185212.html

【网络流24题】魔术球问题(最大流)相关推荐

  1. 网络流24题-魔术球问题

    魔术球问题 时空限制1000ms / 128MB 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. ( ...

  2. 网络流24题 魔术球问题

    传送门 又是一个神奇的建图题,建图\(Van\)♂全不会啊 大体就是我们一个一个的把球放进来,每放进来一个,我们就求出当前的最小路径覆盖数(当前顶点数-最大流),直到最小路径覆盖数\({>}\) ...

  3. 网络流24题——魔术球问题(有向无环图最小路径覆盖)

    链接:https://www.oj.swust.edu.cn/oj/problem/show/1739 分析: 有向无环图最小路径覆盖:给定有向无环图,求一个路径划分,使得每个点在且只在一条路径上,路 ...

  4. [网络流24题]魔术球问题(简化版)

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

  5. loj #6004. 「网络流 24 题」圆桌聚餐(最大流)

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

  6. [网络流24题] 航空路线问题 (费用流)

    洛谷传送门 LOJ传送门 这道题的图还挺好想的吧 反正都是无向边,起点走到终点再回到起点,就相当于从起点走$2$次到达终点,且这两次不经过相同的点,还要经过尽可能多的点 很经典的费用流建图 限制点通过 ...

  7. [网络流24题] 负载平衡问题 (费用流)

    洛谷传送门 LOJ传送门 本题解思路来自hzwer黄学长 搬运后每个位置应该有的货物数量$num=\frac{\sum a_{i}}{n}$ 那么大于$num$的位置都应该把一部分货物提供给其他位置, ...

  8. [网络流24题][CODEVS1914]运输问题(费用流)

    题目描述 传送门 题解 从源点向每一个仓库连边,费用为0,容量为仓库中货物数量: 从每一个零售店向汇点连边,费用为0,容量为零售店应得的货物数量: 从仓库向零售店连边,费用为该仓库运到零售店的费用. ...

  9. 【网络流24题】魔术球问题

    [题目]#6003. 「网络流 24 题」魔术球 [算法]最小路径覆盖(详细知识参考网络流总结) [题解](i+j)为完全平方数则连边,那么问题转化为添加尽可能多的点使得最小路径覆盖≤n(一条简单路径 ...

最新文章

  1. solr学习二(ExtractingRequestHandler)
  2. 终于找到可以一文多发的平台了!
  3. Java企业面试算法新得体会之3二叉树问题24问
  4. python自关联_django自关联,auth模块
  5. [android-wifi](7.1)漫游部分逻辑
  6. 程序员不是神,心态决定一切
  7. Ubuntu执行脚本报错-bash: ./send.py: /usr/bin/python: bad interpreter: Permission denied
  8. 3月25日 编译的四个过程
  9. 与数字化先锋共绘创新蓝图
  10. nodejs fs模块
  11. Windows历史版本
  12. 在知网上找不到的英文文献应该去哪里找?
  13. 计算机电脑怎么开热点,怎么在电脑上开热点?电脑开热点的两种方法介绍
  14. Windows XP的图标结构
  15. 如何对计算机进行磁盘整理,如何对Windows 7进行磁盘碎片整理?
  16. 如何调整MATLAB画布大小?
  17. 【NVMe2.0b 15】NVMe SR-IOV
  18. 熊猫儿 | 燕赵风云,风云燕赵
  19. 像经济学家那样思考:信息、激励与政策
  20. 网件R6220刷机失败

热门文章

  1. Weex学习资料整合
  2. 『流畅的Python』第12章:继承的优缺点
  3. 利用DOM进行照片的切换
  4. 阿里巴巴为什么主推HSF?比Dubbo有哪些优势?
  5. *2-3-7-加入field_automation机制
  6. 使用 HTMLTestRunner.py
  7. 移动端 | table 布局
  8. Valve开发校准软件,LCD屏也能与高端VR头显适配了
  9. Maven提高篇系列之(三)——使用自己的Repository(Nexus)
  10. kitkat-s5p4418drone 记录