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 ...
随机推荐
- Sublime Text3 常用快捷键必看
Sublime Text3 常用快捷键必看 https://blog.csdn.net/md1688/article/details/53043525
- *jquery操作DOM总结 (原创:最全、最系统、实例展示)
jquery操作DOM包括八个方面: 一:jquery对DOM节点的基本操作:二:jquery对DOM节点的CSS样式操作:三:jquery遍历DOM节点:四:jquery创建DOM节点:五:jque ...
- SNP命名
SNP命名 [2016-11-24] 奶茶妹妹是谁,京东老板娘,咦?章泽天!没错! 国民老公是谁?万达少东家,王健林儿子,王思聪!恭喜你又答对了! 函数是谁?这不是数学上的名词吗?不对,是 ...
- postfix 设置邮件头翻译,本域邮件不进行邮件头翻译,仅发送至外网的进行邮件头翻译?
postfix 设置邮件头翻译,本域邮件不进行邮件头翻译,仅发送至外网的进行邮件头翻译? 现在设置的 smtp_generic_maps = hash:/etc/postfix/generic sen ...
- PS制作纸质复古野外露营插画分享
经常有人说一些复古风,就觉得蛮难,其实制作过程其实没有想象中复杂,从1850年到2017年,通过这160多年里的平面设计,给我们的作品添加上一些新鲜的灵感和活力,本次教程就来教大家用PS做出耐看的纸质 ...
- jQuery动画函数回调
$("#show").click(function () { //function 是显示完成之后的回调函数 $("p").show(2000,function ...
- Spring ApplicationContext(八)事件监听机制
Spring ApplicationContext(八)事件监听机制 本节则重点关注的是 Spring 的事件监听机制,主要是第 8 步:多播器注册:第 10 步:事件注册. public void ...
- IOS初级:story board的跳转
本文要实现view1跳到view2,view2又跳回view1. 首先要在视图中拉出一条连接view1和view2的线. 下面是在view1的控制器中实现,从view1跳到view2 //发生跳转前会 ...
- oracle创建、删除 数据库、建立表空间以及插入 删除 修改表
一.创建.删除数据库 oracle OraDb11g_home->配置和移植工具->Database configration Assistant->...然后可以创建或者删除数据 ...
- NOIP水题测试(2017082301)
你们从题目也能看出来今天的题是很水的. 前几期答案还没出,效率有点低,谅解,谅解. 今天的答案应该会出的很快. 下面给题目: 时间限制:3小时 题目一:旅行家的预算 题目二:进制转换 题目三:乘积最大 ...