洛谷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场比赛.男球迷小明喜欢看比 ...
随机推荐
- Navicat premium15安装破解教程
Navicat premium15安装破解教程 注意:安装之前请卸载干净navicat,不要覆盖安装 1.去官网下载Navicat premium15的安装包 官网地址:https://www.nav ...
- 【Linux网络基础】TCP/IP 协议簇(各个常见协议介绍)
一.应用层协议 1. FTP 协议所在层次:应用层协议 名称:FTP协议 协议端口:20,21 协议说明: FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组 ...
- 【Linux常见命令】vi,vim命令
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...
- TreeMap分析(中)
通过上篇文章,大家已经能够理解红黑树的基础数据结构,那么这篇文章就来分析下,在红黑树中插入一个结点后,内部数据结构发生了哪些变化. TreeMap插入某个结点的源码分析 /** * 插入节点,并平衡红 ...
- Linux 搭建nginx的PID
pid logs/nginx.pid 安装的时候就是没有,其实在启动 nginx 时自动生成的 里面存放的是 当前 nginx 住进程的 ID 号:所以在配置文件中指定pidpid /usr/loca ...
- CentOS+Subversion 配置Linux 下 SVN服务器
1.安装#yum install subversion测试安装是否成功:#svnserve –version 回车显示版本说明安装成功 2.配置 ·建立版本库 #mkdir /opt/svnd ...
- 洛谷P3018 [USACO11MAR]树装饰Tree Decoration
洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...
- 写给MongoDB开发者的50条建议Tip21
本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...
- Codeforces Round #622 (Div. 2) 1313 C1
C1. Skyscrapers (easy version) time limit per test1 second memory limit per test512 megabytes inputs ...
- python(数据类型)
一.基本数据类型 (1)numbers 数字 整型 int a = 1 print (type(a)) 长整型 long python3.x 中无此类型 >>> 2 ** 100 1 ...