UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)
(同时也是HDU 2982,UVA的数据多)
题意:平面上有m条有向线段连接了n个点。你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点。你可以多次行走,给多个回路涂色(要么不涂色,要么就至少给一个回路上的边全部涂色)。可以重复经过一个点,但不能重复经过一条有向线段。如下图所示的是一种涂色方法(虚线表示未涂色,即每次都可以从任意点出发染色)。每涂一个单位长度将得到X分,但每使用一种颜色将扣掉Y分。假设你拥有无限多种的颜色,问如何涂色才能使得分最大?输入保证若存在有向线段u -> v,则不会出现有向线段v -> u。
n <= 100,m <= 500,1 <= X,Y <= 1000。
对于坐标(x,y)0 <= x,y <= 1000。
1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define pdi pair<double,int> 5 #define INF 0x7f7f7f7f 6 using namespace std; 7 const int N=200; 8 int x[N], y[N], rudu[N]; 9 int earn, lost, n; 10 vector<int> vect[N], vec[N]; 11 double sum; 12 13 struct node 14 { 15 int from, to, cap, flow; 16 double val; 17 node(){}; 18 node(int from,int to,double val,int cap,int flow):from(from),to(to),val(val),cap(cap),flow(flow){}; 19 }edge[90000]; 20 int edge_cnt; 21 22 void add_node(int from,int to,double val,int cap,int flow) 23 { 24 edge[edge_cnt]=node(from, to, val, cap, flow ); 25 vec[from].push_back(edge_cnt++); 26 } 27 28 void build_graph() 29 { 30 for(int i=1; i<=n; i++) 31 { 32 for(int j=0; j<vect[i].size(); j++) 33 { 34 int t=vect[i][j]; 35 double v= lost - sqrt( pow(x[i]-x[t],2)+pow(y[i]-y[t],2) )*earn; 36 37 if(v<0) 38 { 39 add_node(t, i, -v, 1, 0 ); //反边 40 add_node(i, t, v, 0, 0 ); 41 sum+=v; 42 rudu[t]++,rudu[i]--; 43 } 44 else 45 { 46 add_node(i, t, v, 1, 0); 47 add_node(t, i, -v, 0, 0); 48 } 49 } 50 } 51 for(int i=1; i<=n; i++) 52 { 53 if(rudu[i]>0) 54 { 55 add_node(0, i, 0, rudu[i], 0); 56 add_node(i, 0, 0, 0, 0); 57 } 58 if(rudu[i]<0) 59 { 60 add_node(i, n+1, 0, -rudu[i], 0); 61 add_node(n+1, i, 0, 0, 0); 62 } 63 } 64 } 65 66 int flow[N], path[N], inq[N]; 67 double cost[N]; 68 69 double spfa(int s,int e) 70 { 71 deque<int> que(1,s); 72 cost[s]=0; 73 flow[s]=INF; 74 inq[s]=1; 75 while(!que.empty()) 76 { 77 int x=que.front(); 78 que.pop_front(); 79 inq[x]=0; 80 for(int i=0; i<vec[x].size(); i++) 81 { 82 node e=edge[vec[x][i]]; 83 if(e.cap>e.flow && cost[e.to]>cost[e.from]+e.val ) 84 { 85 flow[e.to]=min(flow[e.from],e.cap-e.flow); 86 cost[e.to]=cost[e.from]+e.val; 87 path[e.to]=vec[x][i]; 88 if(!inq[e.to]) 89 { 90 inq[e.to]=1; 91 que.push_back(e.to); 92 } 93 } 94 } 95 } 96 return cost[e]; 97 } 98 99 double mcmf(int s,int e) 100 { 101 double ans_cost=0.0; 102 while(true) 103 { 104 memset(flow,0,sizeof(flow)); 105 memset(inq,0,sizeof(inq)); 106 memset(path,0,sizeof(path)); 107 for(int i=0; i<=e; i++) cost[i]=1e39; 108 109 double tmp=spfa(s,e); //返回费用 110 if(tmp>1e38) return ans_cost; 111 ans_cost+=tmp; 112 113 int ed=e; 114 while(ed!=s) 115 { 116 int t=path[ed]; 117 edge[t].flow+=flow[n+1]; 118 edge[t^1].flow-=flow[n+1]; 119 ed=edge[t].from; 120 } 121 } 122 } 123 124 int main() 125 { 126 freopen("input.txt", "r", stdin); 127 int b, j=0; 128 while(scanf("%d", &n), n) 129 { 130 scanf("%d%d",&earn,&lost); 131 for(int i=0; i<=n+1; i++) vect[i].clear(); 132 for(int i=0; i<=n+1; i++) vec[i].clear(); 133 memset(edge,0,sizeof(edge)); 134 memset(rudu,0,sizeof(rudu)); 135 edge_cnt=0; 136 sum=0; 137 138 for(int i=1; i<=n; i++) 139 { 140 scanf("%d%d",&x[i],&y[i]); 141 while(scanf("%d",&b), b) vect[i].push_back(b); //原图邻接表 142 } 143 build_graph(); 144 printf("Case %d: %.2f\n", ++j, -(mcmf(0,n+1)+sum)+0.0000001 ); 145 } 146 return 0; 147 }
AC代码
转载于:https://www.cnblogs.com/xcw0754/p/4659201.html
UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)相关推荐
- android手机小内存,世界最小Android手机问世 仅2.4英寸512MB内存
如今的智能手机市场早已被大屏设备所占据,但苹果的iPhone SE证明了小尺寸手机依然有发展空间.可和最近发布的Posh Mobile Micro X S240相比,就连苹果这款手机也会显得巨大无比. ...
- OJ题目9--最小路径、最小消耗的动态规划问题
一般来讲,涉及到最小路径的问题,目标都会有一个固定的行走模式,也就是说对于行走范围内的某一点而言,到达该点的各种可能性是确定了的(被确定了的行走模式所约束).那么走到一点的最小消耗,就等于所有差一步就 ...
- UVA 11419 SAM I AM(最大二分匹配最小点覆盖:König定理)
题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示"行& ...
- python2 with open encoding_python with open as f写中文乱码
python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- wxWidgets:通过组合现有小部件制作新的可重用小部件
wxWidgets:通过组合现有小部件制作新的可重用小部件 wxWidgets:通过组合现有小部件制作新的可重用小部件 wxWidgets:通过组合现有小部件制作新的可重用小部件 以下是如何通过组合现 ...
- android studio导出apk_Android 应用构建速度提升的十个小技巧
应用的构建速度会直接影响开发效率,本文将带您通过改造一个 Android 应用: "Google 追踪圣诞老人 (Google Santa Tracker)" 来为大家提供十个小技 ...
- 配置高性能ElasticSearch集群的9个小贴士
Loggly服务底层的很多核心功能都使用了ElasticSearch作为搜索引擎.就像Jon Gifford(译者注:Loggly博客作者之一)在他近期关于"ElasticSearch vs ...
- C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4100 访问. 给定一个非空特殊的二叉树,每个节点都是正数,并且每 ...
最新文章
- MySQL 优化上来就分库分表?面试官:根本不懂底层原理!
- PyTorch模块类
- 场景创新,推动金融行业数字化转型
- linux 查看opengl版本,linux下查看OpenGL版本
- 有关 Conversion to Dalvik format failed with error 1
- SQL Server 登录更换【Windows身份验证】为【SQL Server 身份验证】
- static和extern的用法总结
- python server酱_Python 超简单的邮件发送方法
- SQL:插入数据的小坑
- 【Oracle】lsnrctl reload 命令简介
- ERROR: The environment variable VG_GNU_PACKAGE must be set. Aborting.
- JavaScript 代码收集
- kotlin 使用viewStub
- ChromeOS+Win双系统安装教程
- win10修改用户名||user中文名改英文名
- 431 Request Header Fields Too Large
- 关于Mysql8.0时区表问题解决
- 习题 3.6 请编程序将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。
- Q1成绩:华为可穿戴设备增幅亮眼,Uber亏损10亿美元!
- 自用PTA题目记录0024