uva1659(最大费用循环流)
紫书上的一道题,做法见紫书P378,这篇博客用的第二种方法,关于正确性的证明,画图可以发现如果一个环是负环,跑最小费用流跑出的是环上的所有正边,再减去负边和即为跑一遍的负权,如果是正环,最小费用流即为负权和的相反数,再加上负权和即为0,即没有计入答案。可能这种方法在处理负权时有一定的普遍性,还是要多做题多体会啊。。。。
PS:今天费用流又写错了,写的是dinic中dfs的那种,保留了那部分代码以便日后修改,,还是记录最短路径稳啊。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=,inf=1e9;
struct node{
double x,y;
}a[maxn];
double calc(node a,node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
struct edg{
int nxt,to,f;
double c;
}e[maxn];
int pe[maxn],pv[maxn],du[maxn],res,t=,n,m,last[maxn],S,T,vis[maxn],q[maxn],head,tail;
double dis[maxn],Min;
void add(int x,int y,int z,double zz){
++t;e[t].nxt=last[x];last[x]=t;e[t].to=y;e[t].f=z;e[t].c=zz;
++t;e[t].nxt=last[y];last[y]=t;e[t].to=x;e[t].f=;e[t].c=-zz;
}
int dfs(int x,int h){
if(x==T){Min+=double(h)*dis[T];return h;}
int tmp=,cp;
for(int i=last[x];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&dis[v]==dis[x]+e[i].c){
cp=dfs(v,min(h-tmp,e[i].f));
e[i].f-=cp;e[i^].f+=cp;tmp+=cp;
if(h==tmp){return h;}
}
}
return tmp;
}
void solve(){
while(){
for(int i=;i<=n+;++i)dis[i]=inf;
memset(vis,,sizeof(vis));head=tail=;
q[++tail]=S;dis[S]=;vis[S]=;
while(head!=tail){
head=(head+)%maxn;
int u=q[head];
for(int i=last[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&dis[v]>dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;
pe[v]=i;pv[v]=u;
if(!vis[v]){
vis[v]=;tail=(tail+)%maxn;q[tail]=v;
}
}
}
vis[u]=;
}
//cout<<dis[T]<<endl;
//system("pause");
if(dis[T]==inf)break;
int tmp=inf;
for(int u=T;u!=S;u=pv[u])tmp=min(tmp,e[pe[u]].f);
for(int u=T;u!=S;u=pv[u]){
e[pe[u]].f-=tmp;
e[pe[u]^].f+=tmp;
}
Min+=tmp*dis[T];
//res+=dfs(S,inf);
}
}
double X,Y;
vector<int>bel[maxn];
int cc,cas;
int main(){
while(scanf("%d",&n)!=EOF){
if(!n)break;
scanf("%lf%lf",&X,&Y);
++cas;
double sum=;
t=;memset(last,,sizeof(last));
memset(du,,sizeof(du));res=;Min=;
for(int i=;i<=n;++i)bel[i].clear();
for(int i=;i<=n;++i){
scanf("%lf%lf",&a[i].x,&a[i].y);
while(scanf("%d",&cc)!=EOF){
if(!cc)break;
bel[i].push_back(cc);
}
}
for(int i=;i<=n;++i){
int len=bel[i].size();
for(int j=;j<len;++j){
double vv=Y-calc(a[i],a[bel[i][j]])*X;
if(vv<){
sum+=vv;
du[bel[i][j]]++;du[i]--;
add(bel[i][j],i,,-vv);
}
else{add(i,bel[i][j],,vv);}
}
}
S=n+,T=n+;
for(int i=;i<=n;++i){
if(!du[i])continue;
if(du[i]>)add(S,i,du[i],);
else{add(i,T,-du[i],);}
}
solve();
printf("Case %d: %.2lf\n",cas,fabs(sum+Min));
}
//system("pause");
return ;
}
/*
4 5 1
0 0 2 3 0
1 0 3 4 0
1 1 4 0 0
1 1 0
1 2 1
0 0 0
10 7 2
0 0 2 4 0
5 0 3 0
5 10 4 10 0
2 3 5 0
7 5 6 0
0 11 1 0
8 0 10 5 0
18 3 7 0
14 5 8 1 0
12 9 9 0
0
*/
uva1659(最大费用循环流)的更多相关文章
- UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)
(同时也是HDU 2982,UVA的数据多) 题意:平面上有m条有向线段连接了n个点.你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点.你可以多次行走,给多个回路涂色(要 ...
- 最小割&网络流应用
重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...
- 图论(网络流):UVa 1659 - Help Little Laura
Laura Luo has just invented a game. Given a beautiful pencil sketch with n points, you're to coloriz ...
- 本宝宝的blog介绍
这里是“小可爱酱”嘤嘤嘤~(名字提供来自星小雨哥哥) 我发现了 不管怎么努力 都会 注孤生 “对不起.” “还有,谢谢你.” 我有一个愿望. “是什么啊?” 就是,希望这个世界上的人们, ta ...
- 那些令人敬佩的刚学OI的大佬
我是萌新刚学OI,请问LCT怎么写常树最小啊 我是女生刚学OI,请问树链剖分哪里写挂了? 萌新求教,这棵SBT哪里有问题啊啊啊…… 刚学OI,请问可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最 ...
- 我刚学OI
我是新人,刚学OI,请问可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫比乌斯反演莫队带花舞蹈链并查集树状数组套主席树预处理动态DP分治FFT求多项式逆元对数函数的指 ...
- @codeforces - 708D@ Incorrect Flow
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...
- bzoj 1061 志愿者招募 有上下界费用流做法
把每一天看作一个点,每一天的志愿者数目就是流量限制,从i到i+1连边,上下界就是(A[i],+inf). 对于每一类志愿者,从T[i]+1到S[i]连边,费用为招募一个志愿者的费用,流量为inf.这样 ...
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
随机推荐
- Struts2把数据封装到集合中之封装到map中
struts框架封装数据可以封装到集合中也可以封装到map中,该篇博客主要讲解将数据封装到map中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) 2. 需求:页面中有可 ...
- 10.16JS日记
1.parseint() 2.parsefloat() 这两个单词运行的时候遇到第一个非数字就结束了 3.var a="hello word" a这个变量为字符串,每一个字母为字 ...
- Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程
Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程 一.捕获异常并重新启用线程 public class Testun { public static voi ...
- 什么是MVVM模式
问题引入1 场景一:团队辛辛苦苦完成了一个项目,抱着激动的心情去给用户做demo,而用户给你的反馈是UI很不满意,要重新修改,否则拒绝验收.大规模修改UI,晴天霹雳!2 场景二:产品在一家客户上线运行 ...
- opencv中imread第二个参数的意义
文档中是这么写的: Flags specifying the color type of a loaded image: CV_LOAD_IMAGE_ANYDEPTH - If set, return ...
- windows下git的使用方法(码云)
这表文章主要是用了可视化操作: 使用命令行操作:https://www.cnblogs.com/mswyf/p/9370238.html 一.安装Git Bash 为了在windows下使用Git,我 ...
- 20172306《Java程序设计与数据结构》第八周学习总结
20172306<Java程序设计>第8周学习总结 教材学习内容总结 第十章最开始自己看的时候,没怎么看懂,等老师讲完之后,又看了一遍,就理解了很多.第十章主要学习了以下几点: 1.对于几 ...
- 201621123008 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用
Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/101174 ...
- java集合示例 小心重载的陷阱
package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework. ...