IndiaHacks 2016 - Online Edition (CF) . D
这题思路很简单,二分m,求最大流是否大于等于x。
但是比赛过程中大部分的代码都被hack了。。。
精度问题,和流量可能超int
关于精度问题,这题真是提醒的到位,如果是先用二分将精度控制在10^-8左右,最后乘一个10^4,精度只能在10-4,而二分控制精度在10^-11很容易死循环(因为double 保存15-16位有效数字,结果可能为10^6级,精确到10-11,double做不到)
所以这题二分可以不写成while(d-b>eps),而直接规定二分的次数,设置成100次,基本可以保证14-15位有效数字都正确了,这时再乘10^4还是能够达到题目中要求的10^-6的精度。
还有一种处理精度的方法:
直接定义上下界就为输出的最后结果,在判断的过程中除以x,最后输出也能满足要求。
第一种精度处理方式:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
#include <iostream>
using namespace std;
#define eps 1e-11
#define N 55
#define M 500500
#define INF 0x3fffff struct node1
{
long long to,w,next;
}edge[M]; long long sn,sm,sx;
long long pre[*N];
long long g[N][N];
long long gap[*N],lv[*N];
long long k,c,m;
long long cnt;
long long n,nn;
long long s,t;
long long ans;
long long sum; void add_edge(long long u,long long v,long long w)
{
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=pre[u];
pre[u]=cnt++;
} long long gdfs(long long k,long long w)
{
if(k==t) return w;
long long f=;
long long mi=nn-;
for(long long p=pre[k];p!=-;p=edge[p].next)
{
long long v=edge[p].to,tw=edge[p].w;
if(tw!=)
{
if(lv[k]==lv[v]+)
{
long long tmp=gdfs(v,min(tw,w-f));
f+=tmp;
edge[p].w-=tmp;
edge[p^].w+=tmp;
if(f==w||lv[s]==nn) break;
}
if(lv[v]<mi) mi=lv[v];
}
}
if(f==)
{
gap[lv[k]]--;
if( gap[ lv[k] ]== )
{
lv[s]=nn;
}
lv[k]=mi+;
gap[lv[k]]++;
}
return f;
} long long sap()
{
memset(lv,,sizeof(lv));
memset(gap,,sizeof(gap));
gap[]=nn;
while(lv[s]<nn)
{
sum+=gdfs(s,INF);
}
return sum;
} long long a[],b[],kk[]; long long check(double mid)
{
sum=;
//mid/=sx;
memset(pre,-,sizeof(pre));
cnt=; for(long long i=;i<sm;i++)
{
add_edge(a[i],b[i],(long long)(kk[i]/mid+eps));
add_edge(b[i],a[i],);
}
if(sap()>=sx)
{
return ;
}
else return ;
} int main()
{
cin>>sn>>sm>>sx;
for(long long i=;i<sm;i++)
{
cin>>a[i]>>b[i]>>kk[i];
} s=;
t=sn;
nn=t+; //这个精度问题还是很坑。。。
double b=,d=10000000.0;
//好坑的东西! 我就操!
int time=;
while(time--)//这里精度太小,竟然会死循环。。。
{
double mid=(b+d)/;
if( check(mid)== )
{
b = mid;
}
else
{
d = mid;
}
}
printf("%.10lf",b*sx);
return ;
}
第二种精度处理方式:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
#include <iostream>
using namespace std;
#define eps 1e-11
#define N 55
#define M 500500
#define INF 0x3fffff struct node1
{
long long to,w,next;
}edge[M]; long long sn,sm,sx;
long long pre[*N];
long long g[N][N];
long long gap[*N],lv[*N];
long long k,c,m;
long long cnt;
long long n,nn;
long long s,t;
long long ans;
long long sum; void add_edge(long long u,long long v,long long w)
{
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=pre[u];
pre[u]=cnt++;
} long long gdfs(long long k,long long w)
{
if(k==t) return w;
long long f=;
long long mi=nn-;
for(long long p=pre[k];p!=-;p=edge[p].next)
{
long long v=edge[p].to,tw=edge[p].w;
if(tw!=)
{
if(lv[k]==lv[v]+)
{
long long tmp=gdfs(v,min(tw,w-f));
f+=tmp;
edge[p].w-=tmp;
edge[p^].w+=tmp;
if(f==w||lv[s]==nn) break;
}
if(lv[v]<mi) mi=lv[v];
}
}
if(f==)
{
gap[lv[k]]--;
if( gap[ lv[k] ]== )
{
lv[s]=nn;
}
lv[k]=mi+;
gap[lv[k]]++;
}
return f;
} long long sap()
{
memset(lv,,sizeof(lv));
memset(gap,,sizeof(gap));
gap[]=nn;
while(lv[s]<nn)
{
sum+=gdfs(s,INF);
}
return sum;
} long long a[],b[],kk[]; long long check(long double mid)
{
sum=;
mid/=sx;
memset(pre,-,sizeof(pre));
cnt=; for(long long i=;i<sm;i++)
{
add_edge(a[i],b[i],(long long)(kk[i]/mid+eps));
add_edge(b[i],a[i],);
}
if(sap()>=sx)
{
return ;
}
else return ;
} int main()
{
cin>>sn>>sm>>sx;
for(long long i=;i<sm;i++)
{
cin>>a[i]>>b[i]>>kk[i];
} s=;
t=sn;
nn=t+; //这个精度问题还是很坑。。。
long double b=,d=1000000000.0;
//好坑的东西! 我就操!
while(d-b > 1e-)//这里精度太小,竟然会死循环。。。
{
long double mid=(b+d)/;
if( check(mid)== )
{
b = mid;
}
else
{
d = mid;
}
}
printf("%.20Lf",b);
return ;
}
IndiaHacks 2016 - Online Edition (CF) . D的更多相关文章
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing
B. Bear and Compressing 题目链接 Problem - B - Codeforces Limak is a little polar bear. Polar bears h ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E - Bear and Forgotten Tree 2 链表
E - Bear and Forgotten Tree 2 思路:先不考虑1这个点,求有多少个连通块,每个连通块里有多少个点能和1连,这样就能确定1的度数的上下界. 求连通块用链表维护. #inclu ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E. Bear and Forgotten Tree 2 bfs set 反图的生成树
E. Bear and Forgotten Tree 2 题目连接: http://www.codeforces.com/contest/653/problem/E Description A tre ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
D. Delivery Bears 题目连接: http://www.codeforces.com/contest/653/problem/D Description Niwel is a littl ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力
C. Bear and Up-Down 题目连接: http://www.codeforces.com/contest/653/problem/C Description The life goes ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing 暴力
B. Bear and Compressing 题目连接: http://www.codeforces.com/contest/653/problem/B Description Limak is a ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题
A. Bear and Three Balls 题目连接: http://www.codeforces.com/contest/653/problem/A Description Limak is a ...
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)——A - Bear and Three Balls(unique函数的使用)
A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CodeForces 653 A. Bear and Three Balls——(IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2))
传送门 A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input ...
随机推荐
- spark完全分布式集群搭建
最近学习Spark,因此想把相关内容记录下来,方便他人参考,也方便自己回忆吧 spark开发环境的介绍资料很多,大同小异,很多不能一次配置成功,我以自己的实际操作过程为准,详细记录下来. 1.基本运行 ...
- 编程算法 - 和为s的两个数字 代码(C)
和为s的两个数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个递增排序的数组和一个数字s, 在数组中查找两个数, 使得它们的和正好是 ...
- 倍福TwinCAT(贝福Beckhoff)应用教程12.1 TwinCAT控制松下伺服 连接和试运行
首先是用松下伺服自带的软件可以测试运行(驱动器,电机都连接好,然后用USB线连接到松下伺服驱动器的X1口),打开调试软件会自动提示连接到伺服 一般需要对驱动器清除绝对值编码器数据(驱动器可能报错4 ...
- CSDN下载频道于2014年7月17日改版,23日-24日系统维护
尊敬的用户你们好: CSDN于2005年推出了下载服务,经过数年的发展,下载频道的用户已经为无数用户提供了帮助.分享500万的技术资源. 感谢用户们的资源共享精神,以及对CSDN下载频道的支持 下载频 ...
- C语言-编译
编译的时候只是需要知道函数原型(即只需要 xxx.h 文件即可), 不需要知道函数定义, 在链接阶段可以把 xxx.c 生成的 xxx.o 链接进去, 以知道函数定义 编译时,编译器需要的是语法的正确 ...
- Pattern Recognition and Machine Learning 模式识别与机器学习
模式识别(PR)领域: 关注的是利⽤计算机算法⾃动发现数据中的规律,以及使⽤这些规律采取将数据分类等⾏动. 聚类:目标是发现数据中相似样本的分组. 反馈学习:是在给定的条件下,找到合适的动作, ...
- iBatis in或not in 查询
iBatis in或not in 查询 open:内容开头 close:内容结尾 conjunction:分隔符 <isNotNull prepend="and" pro ...
- genymotion启动黑屏的原因及临时解决方法
解决办法 好像是要激活网络,具体原因不知道!!! sudo ifconfig vboxnet0 up 下面好像更好使一点 sudo ip link set dev vboxnet0 up
- 【Scala】使用Option、Some、None,避免使用null
避免null使用 大多数语言都有一个特殊的关键字或者对象来表示一个对象引用的是"无",在Java,它是null.在Java 里,null 是一个关键字,不是一个对象,所以对它调用不 ...
- xilinx平台DDR3设计教程之仿真篇_中文版教程
https://wenku.baidu.com/view/ac32c8bcf705cc1754270923.html https://wenku.baidu.com/view/1d665697f185 ...