这题思路很简单,二分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的更多相关文章

  1. 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 ...

  2. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E - Bear and Forgotten Tree 2 链表

    E - Bear and Forgotten Tree 2 思路:先不考虑1这个点,求有多少个连通块,每个连通块里有多少个点能和1连,这样就能确定1的度数的上下界. 求连通块用链表维护. #inclu ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. opencv提取surf特征点出现的错误

    opencv实现surf特征的提取.本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程. 首先,我把提取surf特征的过程整合成了一个函数,我单独建立一 ...

  2. BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

    题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyf ...

  3. 【Java】Java_09 类型转换

    1.自动类型转换 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型.在图中,黑色的实线表示无数据丢失的自动类型转换,而红色的虚线表示在转换时可能会精度的损失. 特例: 可以将整型常量直接赋 ...

  4. Struts Spring Plugin注意点

    Settings The following settings can be customized. See the developer guide. Setting Description Defa ...

  5. YII用户注冊和用户登录(五)之进行session和cookie分析 ,并在前后区分session和cookie

    5 进行session和cookie分析 ,并在前后区分session和cookie: 记住登录状态 这样下次再登录站点的时候.就不用反复输入username和password. 是浏览器的cooki ...

  6. iDempiere = OSGi + ADempiere 一款ERP&CRM&SCM系统、助力中小企业发展

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ iDempiere = OSGi + ADempiere 一款ERP&CRM&a ...

  7. windows lua 多线程 线程同步

    今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua ...

  8. Spring boot centos部署启动停止脚本

    原文地址:http://www.cnblogs.com/skyblog/p/7243979.html 使用脚本启动和关闭服务,centos下的脚本启动和关闭可以如下: start(){ now=`da ...

  9. Easy UI datebox控件无法正常赋值

    <input id="AcceptDetail_IssuingDate" class="easyui-datebox" data-options=&quo ...

  10. nginx sever_name正则

    nginx server_name 规则: 1.确切的server_name匹配 例如: server { listen ; server_name www.luwen.cc luwen.cc; .. ...