洛谷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场比赛.男球迷小明喜欢看比 ...
随机推荐
- HTML中使用CSS样式(上)
在每一个标签上都可以设置style属性,这就是CSS样式: <div style="height:48px;border: 1px solid red;text-align:cente ...
- 利用POI工具读取word文档并将数据存储到sqlserver数据库中
今天实现了利用POI工具读取word文档,并将数据存储到sql数据库中,代码如下: package word; import java.io.File; import java.io.FileInpu ...
- 一维滑动窗口(SlidingWindow)
滑动窗口(Sliding Window)问题经常使用快慢指针(slow, fast pointer)[0, slow) 的区域为滑动窗口已经探索过的区域[slow, fast]的区域为滑动窗口正在探索 ...
- 导入sql错误
2019独角兽企业重金招聘Python工程师标准>>> 导入sql错误: This function has none of DETERMINISTIC, NO SQL, or RE ...
- chrome清除缓存、不使用缓存而刷新快捷键
Ctrl+Shift+Del 清除Google浏览器缓存的快捷键 Ctrl+Shift+R 重新加载当前网页而不使用缓存内容 转载于:https://www.cnblogs.com/JAVA-ST ...
- 图论--最长路--洛谷P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- 图论--边双连通V-DCC缩点
// tarjan算法求无向图的割点.点双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...
- 一个简单的wed服务器SHTTPD(4)————SHTTPD支持CGI的实现
//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...
- C/S程序设计范式
在socket编程之并发回射服务器3篇文章中,提到了3种设计范式: 多进程 父进程阻塞于accept调用,然后为每个连接创建一个子进程. 多线程 主线程阻塞于accept调用,然后为每个连接创建一个子 ...
- N - 寿司晚宴 HYSBZ - 4197 状压dp
N - 寿司晚宴 HYSBZ - 4197 推荐题解 这个题目我觉得还是很难的,借助题解写出来的,题解还看了很久,现在还是不是很理解. 首先这个数比较大有500,如果直接就像这个题目S - Query ...