HDU 4744 Starloop System(ZKW费用流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4744
题意:三维空间n个点,每个点有一个wi值。每对点的距离定义为floor(欧拉距离),每对点之间建一条边的费用为两点间的距离,每对点之间可以建多条边。现要求对每一个点 i ,都在wi 个简单环上(每个点每条边都只经过一次),每条边只能属于一个简单环,简单环的费用为每条边的费用之和,问最小的建环费用。
思路:每个点拆成a、b两个点,从附加源点S到a连一条边,容量为wi,费用为0;从b到附加汇点T连一条边,容量为wi,费用为0。每两个点i, j之间,ai到bj连一条边,bi到aj连一条边,费用均为i, j的距离,容量均为无穷大。若最大流=sum{wi},那么有解,输出最小费用,否则输出-1。
struct node { int u,v,next,cost,cap; }; node edges[N*500]; int head[N],e; void add(int u,int v,int cap,int cost) { edges[e].u=u; edges[e].v=v; edges[e].cap=cap; edges[e].cost=cost; edges[e].next=head[u]; head[u]=e++; } void Add(int u,int v,int cap,int cost) { add(u,v,cap,cost); add(v,u,0,-cost); } int dis[N],S,T,nodeNum; int maxFlow,minCost; void SPFA() { int i; for(i=0;i<=nodeNum;i++) dis[i]=INF; priority_queue<pair<int,int> > Q; dis[S]=0; Q.push(MP(0,S)); int u,v,d; while(!Q.empty()) { u=Q.top().second; d=-Q.top().first; Q.pop(); if(dis[u]!=d) continue; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(edges[i].cap&&dis[v]>d+edges[i].cost) { dis[v]=d+edges[i].cost; Q.push(MP(-dis[v],v)); } } } for(i=0;i<=nodeNum;i++) dis[i]=dis[T]-dis[i]; } int h[N]; int DFS(int u,int flow) { if(u==T) { maxFlow+=flow; minCost+=flow*dis[S]; return flow; } h[u]=1; int now=flow,i,v,temp; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(edges[i].cap&&!h[v]&&dis[u]==dis[v]+edges[i].cost) { temp=DFS(v,min(now,edges[i].cap)); edges[i].cap-=temp; edges[i^1].cap+=temp; now-=temp; if(!now) break; } } return flow-now; } int modifyLabel() { int d=INF,i,j,v; for(i=1;i<=nodeNum;i++) if(h[i]) { for(j=head[i];j!=-1;j=edges[j].next) { v=edges[j].v; if(edges[j].cap&&!h[v]) { upMin(d,dis[v]+edges[j].cost-dis[i]); } } } if(d==INF) return 0; for(i=0;i<=nodeNum;i++) if(h[i]) dis[i]+=d; return 1; } int MCMF(int s,int t,int n) { S=s; T=t; nodeNum=n; SPFA(); maxFlow=minCost=0; int i; while(1) { while(1) { for(i=0;i<=nodeNum;i++) h[i]=0; if(!DFS(s,INF)) break; } if(!modifyLabel()) break; } return minCost; } struct point { double x,y,z; void get() { cin>>x>>y>>z; } }; point p[N]; int W[N],n,s,t; int d[N][N]; int dist(point a,point b) { double L=sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z); L=sqrt(L); L=floor(L); return L; } int main() { Rush(n) { if(!n) break; int i,sum=0; FOR1(i,n) p[i].get(),RD(W[i]),sum+=W[i]; int j; for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { d[i][j]=d[j][i]=dist(p[i],p[j]); } clr(head,-1); e=0; s=0; t=n*2+1; FOR1(i,n) Add(s,i,W[i],0),Add(i+n,t,W[i],0); FOR1(i,n) FOR1(j,n) if(i!=j) { Add(i,n+j,INF,d[i][j]); } S=0; i64 ans=MCMF(s,t,t+1); if(maxFlow!=sum) ans=-1; PR(ans); } }
HDU 4744 Starloop System(ZKW费用流)的更多相关文章
- HDU 4744 Starloop System(最小费用最大流)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Description At the end of the 200013 th year of the Galaxy era, the war between Carbon-based lives a ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 学习了ZKW费用流
所谓ZKW费用流,其实就是Dinic. 若干年前有一个人发明了最小增广路算法,每次用BFS找一条增广路,时间O(nm^2) 然后被DinicD飞了:我们为什么不可以在长度不变时多路增广呢?时间O(n^ ...
- zkw费用流
期末结束,竞赛生活继续开始,先怒刷完寒假作业再说 至于期末考试,数学跪惨,各种哦智障错,还有我初中常用的建系大法居然被自己抛至脑后,看来学的还是不扎实,以后数学要老老实实学.物理被永哥黑了两分,然后很 ...
- 【zkw费用流】[网络流24题]餐巾计划问题
题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...
- CSU 1948: 超级管理员(普通费用流&&zkw费用流)
Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...
- BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流
https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...
- 图论-zkw费用流
图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...
- zkw费用流 学习笔记
分析 记\(D_i\)为从\(S\)出发到\(i\)的最短路 最短路算法保证, 算法结束时 对于任意存在弧\((i,j)\)满足\(D_i + c_{ij}\ge D_j\) ① 且对于每个 \(j\ ...
随机推荐
- JS 学习笔记--7---正则表达式
正则表达式中的内容很多,也很深,下面只是一些基本的知识点,练习中使用的浏览器是IE10,若有不当处请各位朋友指正,我会在第一时间修改错误之处. 匹配的概念:是包含的意思,不是相等的意思 1.正则表达式 ...
- c++ union
什么是union? 翻译过来说,就是共用体,或者也叫联合体.说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时: 1 2 3 4 5 6 struct ...
- POI中设置Excel单元格格式
引用:http://apps.hi.baidu.com/share/detail/17249059 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWork ...
- 负MARGIN之讲解
css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...
- 安装JDK后环境变量的配置
1.JAVA_HOME:JDK的安装路径2.CLASSPATH:java运行时加载的类路径,即JDK的lib下面的tools.jar和dt.jar3.PATH:JDK安装包下的bin目录
- BZOJ 1071组队
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1071 题目很好,居然写了很久,题解找了真多: 主要两种做法: O(n^2lgn),通过优先 ...
- 定位position详解:relative与absolute
定位标签:position 包含属性:relative(相对) absolute(绝对) 1.position:relative; 如果对一个元素进行相对定位,首先它将出现在它所在的位置上.然后通过设 ...
- HDU3487 Play With Chains(Splay)
很裸的Splay,抄一下CLJ的模板当作复习,debug了一个下午,收获是终于搞懂了以前看这个模板里不懂的内容.以前用这个模板的时候没有看懂为什么get函数返回的前缀要加个引用,经过一下午的debug ...
- NDK 编译可执行程序
以Hello Android工程为例. 建立好工程hello-a,在jni目录下创建文件hello-a.c,文件内容如下.(注意是jni目录,使用src目录编译会出错) #include <st ...
- Xcode 创建静态库和动态库
1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...