洛谷P2765 魔术球问题
题目链接:https://www.luogu.org/problemnew/show/P2765
知识点: 最大流
解题思路:
本题所有边的容量均为 \(1\)。
从 \(1\) 开始加入数字,将这个数拆成两个点:\(P_1\) 连源点,\(P_2\) 连汇点,然后枚举所有比它小并且与它加起来是完全平方数的正整数 \(Num\) ,从 \(Num\) 的 \(P_1\) 连一条边到目前要加入的数字的 \(P_2\)。
建完边后在之前的残量网络的基础上跑 \(Dinic\),如果没有新的流量通过,说明需要用新的柱子来放新加入的数,将新加入的数字作为新的链表的链表头。
当需要用的柱子数大于 \(n\) 时,停止加入数字,利用跑 \(Dinic\) 的过程中建立起来的链表输出答案。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=;
const int INF=0x3f3f3f3f; struct edge{
int to,cap,rev;
};
int next_pt[MAXN];
vector<edge> G[MAXN];
bool used[MAXN];
void add_edge(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,,G[from].size()-});
}
int dfs(int v,int t,int f){
if(v==t) return f;
used[v]=true;
for(int i=;i<G[v].size();i++){
edge &e=G[v][i];
if(!used[e.to] && e.cap>){
int d=dfs(e.to,t,min(f,e.cap));
if(d>){ //d>0,代表有新的流量注入
e.cap-=d;
G[e.to][e.rev].cap+=d;
next_pt[v/]=e.to/; //用链表记录下一个数
return d;
}
}
}
return ;
}
int max_flow(int s,int t){
int flow=;
for(;;){
memset(used,,sizeof(used));
int f=dfs(s,t,INF);
if(f==) return flow;
flow+=f;
}
}
bool vis[MAXN];
int head[];
int main(){
int n;
scanf("%d",&n);
int s=,t=MAXN-;
int max_num=,had=;
while(had<=n){
max_num++;
add_edge(s,max_num<<,); //P1
add_edge(max_num<<|,t,); //P2
for(int i=;;i++){
if(i*i>max_num){
int tmp=i*i-max_num;
if(tmp>=max_num) break;
add_edge(tmp<<,max_num<<|,);
}
}
if(!max_flow(s,t)){
had++;
head[had]=max_num;
}
}
printf("%d\n",max_num-);
for(int i=;i<=n;i++){
if(!vis[head[i]]){
for(int j=head[i];j!=&&j!=t/;j=next_pt[j]){
vis[j]=true;
printf("%d ",j);
}
puts("");
}
} return ;
}
洛谷P2765 魔术球问题的更多相关文章
- 洛谷 P2765 魔术球问题 解题报告
P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...
- 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)
P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...
- 洛谷P2765魔术球问题 最小路径覆盖
https://www.luogu.org/problemnew/show/P2765 看到这一题第一眼想到:这不是二分最大流吗,后来发现还有一种更快的方法. 首先如果知道要放多少个球求最少的柱子,很 ...
- 洛谷 [P2765] 魔术球问题
贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- 洛谷P2765 魔术球问题(最大流)
传送门 %%%KSkun大佬 话说明明是网络流……这题竟然还有打表找规律和纯贪心AC的……都是神犇啊…… 来说一下如何建图.首先把每一个点拆成$X_i$和$Y_i$,然后$S$向$X_i$连一条容量为 ...
- 洛谷P2765 魔术球问题(贪心 最大流)
题意 已经很简洁了吧. 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...
- P2765 魔术球问题
P2765 魔术球问题 贪心模拟就可以过.........好像和dinic没啥关系 找找规律发现可以贪心放.n又灰常小. 设答案=m 你可以$O(mn)$直接模拟过去 闲的慌得话可以像我用个$se ...
- P2765 魔术球问题 网络流二十四题重温
P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们 ...
- [洛谷P2113] 看球泡妹子
洛谷题目链接:看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有N支球队,M场比赛.男球迷小明喜欢看比 ...
随机推荐
- MYSQL隔离级别 与 锁
1.四种隔离级别下数据不一致的情况 脏读 不可重复读 幻读 RU 是 是 是 RC(快照读) 否 是 是 RC(当前读) 否 否 是 RR(快照读) 否 否 是 RR(当前读) 否 否 否 Ser ...
- 集合框架-day10
day10-集合框架-对象数组的概述与引用 1 集合框架的简单介绍: A:集合的由来 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任 ...
- 浅谈 Objective-C Associated Objects
简介 Associated Objects 是 Objective-C 2.0 中 Runtime 的特性之一. 在 <objc/runtime.h> 中定义的三个方法, void obj ...
- java集合的简单用法
typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...
- INTERVIEW #0
一.造成网络延迟的可能原因 1,WiFi所有用户上下行流量共用一个信道,当用户太多或者有人在下载大的资源时带宽不够,丢包: 2,线路质量不佳导致信噪比太低,比如光纤损耗太大等. 二.IPv6优势 1, ...
- CodeForces 1058C C. Vasya and Golden Ticket
C. Vasya and Golden Ticket time limit per test1 second memory limit per test256 megabytes inputstand ...
- python(time 模块)
一.Time 模块 1.时间戳 时间戳是指格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) 起至现在的总秒数 最早出现的 UNIX 操作系统考 ...
- 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件
主函数: #include "lcw_shttpd.h" //初始化时服务器的默认配置 extern struct conf_opts conf_para= { "/us ...
- redis关闭报没有权限No auth
Redis安装之后,如果设置了密码,需要在关闭服务的时候也提供密码,否则无法关闭服务,可以直接通过修改/etc/init.d/redis启动脚本解决. Redis服务的启动和关闭脚本,只需要在关闭的脚 ...
- Java笔记(day23-day26)
IO流1,复制一个文本文件. 1,明确体系: 源:InputStream ,Reader 目的:OutputStream ,Writer 2,明确数据: ...