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 ...
随机推荐
- EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
加上AsNoTracking. 人不能两次踏入同一条河. 我 就踏入了.o(╥﹏╥)o
- js拷贝指定内容到剪切板
function copyTextToClipboard(text) { var textArea = document.createElement("textarea"); te ...
- vue 初识组件
Vue.component("greeting",{ template: `<p>{{ name }}大家好 <button v-on:click="c ...
- python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数
- 常用Date操作方法
public class DateUtils { /** * 获取时间戳 * 输出结果:1438692801766 */ @Test public void getT ...
- Android开发之使用GridView+仿微信图片上传功能(附源代码)
前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021 .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...
- hdu 1254(两个BFS) 推箱子
http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以 ...
- 虚拟机安装centos7, 再安装gitlab 简单步骤
先安装Linux centos7(朋友贡献的. Linux官网有下) 我自己用vm安装的. 未出现特殊状况 gitlab的搭建 安装基础包 yum -y install curl policycore ...
- Delphi中静态方法重载还是覆盖的讨论
Delphi中静态方法重载还是覆盖的讨论 新人学习Delphi的时候,容易搞不懂的一个问题,当子类方法和基类方法同名,并且参数也一样的时候,叫做什么呢?是覆盖,还是重载呢? 答案是隐藏父类方法. 一般 ...
- How to make a USB stick use ISO image file in debian
4.3.1. Preparing a USB stick using a hybrid CD or DVD image Debian CD and DVD images can now be writ ...