博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[网络流24题] 魔术球问题
阅读量:4494 次
发布时间:2019-06-08

本文共 2119 字,大约阅读时间需要 7 分钟。

本来是cogs上面的题来着,但是现在上不去了。

题目链接:
听说贪心可做,打表找规律可做(都是些什么神奇做法啊,这难道不是让我们用网络流做的吗喂
最大流一类转化的问题。建图是关键。
题目的大概意思:用最少的柱子放1-n个球,要求同一根柱子上两个相邻的球数值之和为完全平方数。n要尽可能地大。其实我们读了题目之后是不是能想到最小路径覆盖(不相交)呢?
如果不会DAG最小路径覆盖的可以。(蒟蒻推广一波博客qwqwq大家翻一下能找到)
有一个定理就是最小路径覆盖数=节点个数-最大匹配,证明我在博客里写的有。
那么思路就请清晰了,拆点肯定是必不可少的。如果要连边,肯定是u1->v2。然后因为每个球有两种状态,一种是自己新开一个柱子放,一种是从其他球那里承接过来。最后记得每个点分别向S和T连边。
emmmm如果你问我怎么确定球地上限呢?我也不知道,大家去看别的大佬的博客上好像是有证明的,我只是按着一般网络流能处理的数据范围写的啦qwq
具体细节看代码吧qwq
代码如下:

#include
#include
#include
#include
#include
#define MAXN 100010#define EX 2333#define S 0#define T 5010using namespace std;int n,t=1,ans;int head[MAXN],dis[MAXN],cur[MAXN],to[MAXN],done[MAXN];bool issqr[MAXN];struct Edge{int nxt,to,dis;}edge[MAXN];inline void add(int from,int to,int dis){ edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t; edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=0,head[to]=t;}inline void addedge(int x){ for(int i=1;i
q; memset(dis,0x3f,sizeof(dis)); memcpy(cur,head,sizeof(head)); q.push(S);dis[S]=0; while(!q.empty()) { int u=q.front();q.pop(); for(int i=head[u];i;i=edge[i].nxt) { int v=edge[i].to; if(dis[v]==0x3f3f3f3f&&edge[i].dis) dis[v]=dis[u]+1,q.push(v); } } if(dis[T]==0x3f3f3f3f) return false; return true;}inline int dfs(int x,int f){ if(!f||x==T) return f; int used=0,w; for(int i=cur[x];i;i=edge[i].nxt) { int v=edge[i].to; cur[x]=i; if(dis[v]==dis[x]+1&&(w=dfs(v,min(edge[i].dis,f)))) { used+=w,f-=w; edge[i].dis-=w,edge[i^1].dis+=w; to[x]=v; if(!f) break; } } return used;}int main(){ #ifndef ONLINE_JUDGE freopen("ce.in","r",stdin); #endif scanf("%d",&n); int c; for(int i=1;i<=100;i++) c=i*i,issqr[c]=1; for(int i=1;i<=5000;i++) { addedge(i); while(bfs()) ans+=dfs(S,(int)1e9); if(i-ans>n){ans=i-1;break;} } printf("%d\n",ans); to[0]=0; for(int i=1;i<=ans;i++) { if(done[i]==1) continue; printf("%d ",i);done[i]=1; int now=to[i]>ans?to[i]-EX:to[i]; done[now]=1; while(now!=0) { printf("%d ",now); now=to[now]>ans?to[now]-EX:to[now];done[now]=1; } printf("\n"); } return 0;}

转载于:https://www.cnblogs.com/fengxunling/p/10294687.html

你可能感兴趣的文章
ViewPager加载Activity
查看>>
移动APP项目研发流程及版本规划(转)
查看>>
Jquery 操作HTML5自定义属性data-*
查看>>
python redis
查看>>
一文弄懂神经网络中的反向传播法——BackPropagation
查看>>
18.错误处理
查看>>
边界值测试
查看>>
windows socket client server 测试
查看>>
软件项目外包网站收集
查看>>
把getJson() 设置为同步执行
查看>>
layUI 几个简单的弹出层
查看>>
MySQL 一致性读 深入研究
查看>>
求解组合序列
查看>>
2018年暑假第七周
查看>>
【OpenCV入门指南】第一篇 安装OpenCV
查看>>
每日一小练——高速Fibonacci数算法
查看>>
Windows下Subversion配置管理员指南
查看>>
垂直居中及容器内图片垂直居中的CSS解决方法
查看>>
26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL
查看>>
.Net C# 与 非托管C++互操作性
查看>>