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 ...
随机推荐
- Django TypeError: isinstance() arg 2 must be a type or tuple of types
报错: TypeError: isinstance() arg must be a type or tuple of types from django.db import modelsfrom dj ...
- (转)Android学习路线总结,绝对干货
一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知.懂的越多的时候你才会发现懂的越少. 如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大. ...
- redis 哨兵(sentinel)
redis哨兵 哨兵自动故障转移 自动通知应用最新master信息 无需担心,master挂了,程序不需要修改IP啥的,由哨兵自动完成 修改sentinel.conf protected-mode n ...
- PAT 1009 说反话 (20)(代码)
1009 说反话 (20)(20 分) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空 ...
- Android.API.Context.getFilesDir()
1. Context.getFilesDir() http://developer.android.com/reference/android/content/Context.html#getFile ...
- 探索未知种族之osg类生物---器官初始化二
那我们回到ViewerBase::frame函数中来,继续看看为什么osg生命刚刚出生的时候会大哭,除了初始化了eventQuene和cameraManipulator之外还对那些器官进行了初始化.在 ...
- UOJ 274 温暖会指引我们前进 - LCT
Solution 更新掉路径上温暖度最小的边就可以了~ Code #include<cstdio> #include<cstring> #include<algorith ...
- Python数据库工具类MySQLdb使用
MySQLdb模块用于连接mysql数据库. 基本操作 # -*- coding: utf-8 -*- #mysqldb import time, MySQLdb ...
- 大神你好,可以帮我P张图吗?
韩国版的求大神帮我P张图,看得有点下巴脱臼啊!哈哈哈哈哈哈哈~ 感觉照片拍得很尴尬,请大神P得更有动感 拍了跳跃照片,但内衣露出来一点,能帮忙去掉吗 不喜欢没穿制服的样子,请帮忙加上制服 希望背景 ...
- ubuntu安装jre
1)登录java官网,下载jre,并解压,解压后的jre文件夹移动到 /usr/lib/java 路径下 2)配置系统环境变量 JAVA_HOME CLASSPATH PATH 打开/etc/envi ...