题目链接: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 魔术球问题的更多相关文章

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

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

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

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

  3. 洛谷P2765魔术球问题 最小路径覆盖

    https://www.luogu.org/problemnew/show/P2765 看到这一题第一眼想到:这不是二分最大流吗,后来发现还有一种更快的方法. 首先如果知道要放多少个球求最少的柱子,很 ...

  4. 洛谷 [P2765] 魔术球问题

    贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  5. 洛谷P2765 魔术球问题(最大流)

    传送门 %%%KSkun大佬 话说明明是网络流……这题竟然还有打表找规律和纯贪心AC的……都是神犇啊…… 来说一下如何建图.首先把每一个点拆成$X_i$和$Y_i$,然后$S$向$X_i$连一条容量为 ...

  6. 洛谷P2765 魔术球问题(贪心 最大流)

    题意 已经很简洁了吧. 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...

  7. P2765 魔术球问题

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

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

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

  9. [洛谷P2113] 看球泡妹子

    洛谷题目链接:看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有N支球队,M场比赛.男球迷小明喜欢看比 ...

随机推荐

  1. MYSQL隔离级别 与 锁

    1.四种隔离级别下数据不一致的情况   脏读 不可重复读 幻读 RU 是 是 是 RC(快照读) 否 是 是 RC(当前读) 否 否 是 RR(快照读) 否 否 是 RR(当前读) 否 否 否 Ser ...

  2. 集合框架-day10

    day10-集合框架-对象数组的概述与引用 1 集合框架的简单介绍: A:集合的由来 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任 ...

  3. 浅谈 Objective-C Associated Objects

    简介 Associated Objects 是 Objective-C 2.0 中 Runtime 的特性之一. 在 <objc/runtime.h> 中定义的三个方法, void obj ...

  4. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

  5. INTERVIEW #0

    一.造成网络延迟的可能原因 1,WiFi所有用户上下行流量共用一个信道,当用户太多或者有人在下载大的资源时带宽不够,丢包: 2,线路质量不佳导致信噪比太低,比如光纤损耗太大等. 二.IPv6优势 1, ...

  6. CodeForces 1058C C. Vasya and Golden Ticket

    C. Vasya and Golden Ticket time limit per test1 second memory limit per test256 megabytes inputstand ...

  7. python(time 模块)

    一.Time 模块 1.时间戳 时间戳是指格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) 起至现在的总秒数 最早出现的 UNIX 操作系统考 ...

  8. 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件

    主函数: #include "lcw_shttpd.h" //初始化时服务器的默认配置 extern struct conf_opts conf_para= { "/us ...

  9. redis关闭报没有权限No auth

    Redis安装之后,如果设置了密码,需要在关闭服务的时候也提供密码,否则无法关闭服务,可以直接通过修改/etc/init.d/redis启动脚本解决. Redis服务的启动和关闭脚本,只需要在关闭的脚 ...

  10. Java笔记(day23-day26)

     IO流1,复制一个文本文件. 1,明确体系:        源:InputStream ,Reader        目的:OutputStream ,Writer    2,明确数据:       ...