【BZOJ2285】[SDOI2011]保密(分数规划,网络流)

题面

BZOJ

洛谷

题解

首先先读懂题目到底在干什么。

发现要求的是一个比值的最小值,二分这个最小值\(k\),把边权转换成\(t-sk\),其中\(t\)是时间,\(s\)是安全系数。那么通过一遍\(SPFA\)可以求出到达所有的目标点的危险性的最小值,用\(SPFA\)是因为存在负边权。显然到达每个位置的危险性最小值是独立计算的。

因为是每个空腔都要探索其出入口中的一个,不难发现这个东西就是一个最小割(似乎是最大权闭合子图???)。那么再跑一遍网络流就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define MAX 1010
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
const double eps=1e-3;
namespace MaxFlow
{
struct Line{int v,next;double w;}e[200000];
int h[MAX],cnt=2;
inline void Add(int u,int v,double w)
{
e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
}
int level[MAX];
int S,T,cur[MAX];
bool bfs()
{
memset(level,0,sizeof(level));level[S]=1;
queue<int> Q;Q.push(S);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
if(fabs(e[i].w)>eps&&!level[e[i].v])
Q.push(e[i].v),level[e[i].v]=level[u]+1;
}
return level[T];
}
double dfs(int u,double flow)
{
if(u==T||fabs(flow)<eps)return flow;
double ret=0;
for(int &i=cur[u];i;i=e[i].next)
{
int v=e[i].v;double d;
if(fabs(e[i].w)>eps&&level[v]==level[u]+1)
{
d=dfs(v,min(flow,e[i].w));
ret+=d,flow-=d;
e[i].w-=d;e[i^1].w+=d;
}
}
return ret;
}
double Dinic()
{
double ret=0;
while(bfs())
{
memcpy(cur,h,sizeof(h));
ret+=dfs(S,1e18);
}
return ret;
}
}
int n,m,n1,m1;
double Sv[MAX];
namespace Graph
{
struct Line{int v,next,t,s;}e[200200];
int h[MAX],cnt=1;
inline void Add(int u,int v,int t,int s){e[cnt]=(Line){v,h[u],t,s};h[u]=cnt++;}
double dis[MAX];bool vis[MAX];
double SPFA(int T,double mid)
{
for(int i=1;i<=n;++i)dis[i]=1e18,vis[i]=false;
dis[n]=0;queue<int>Q;Q.push(n);vis[n]=true;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;double w=e[i].t-mid*e[i].s;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])vis[v]=true,Q.push(v);
if(v==T&&dis[v]<eps)return dis[T];
}
}
vis[u]=false;
}
return dis[T];
}
void work()
{
for(int i=1;i<=n1;++i)
{
double l=0,r=11,ret=1e9;
while(r-l>1e-3)
{
double mid=(l+r)/2;
if(SPFA(i,mid)<eps)r=mid,ret=mid;
else l=mid;
}
Sv[i]=ret;
}
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read(),s=read(),t=read();
Graph::Add(u,v,s,t);
}
m1=read();n1=read();
Graph::work();
MaxFlow::S=0;MaxFlow::T=n1+1;
for(int i=1;i<=n1;++i)
if(i&1)MaxFlow::Add(MaxFlow::S,i,Sv[i]);
else MaxFlow::Add(i,MaxFlow::T,Sv[i]);
for(int i=1;i<=m1;++i)
{
int u=read(),v=read();
MaxFlow::Add(u,v,1e9);
}
double ans=MaxFlow::Dinic();
if(ans>1e9)puts("-1");
else printf("%.1lf\n",ans);
return 0;
}

【BZOJ2285】[SDOI2011]保密(分数规划,网络流)的更多相关文章

  1. BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】

    题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...

  2. BZOJ2285 : [Sdoi2011]保密

    首先通过分数规划,二分答案$mid$,将每条边边权重置为$t-mid\times s$,用DP求出终点到该点的最短路,若非正则可以更小. 如此可以计算出每个出入口的最小危险值,然后把奇点放在$S$,偶 ...

  3. 【XSY2718】gift 分数规划 网络流

    题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...

  4. zju2676 Network Wars 分数规划+网络流

    题意:给定无向图,每条边有权值,求该图的一个割集,是的该割集的平均边权最小 Amber的<最小割模型在信息学竞赛中的应用>中讲的很清楚了. 二分答案k,对每条边进行重新赋值为原边权-k,求 ...

  5. bzoj 1312: Hard Life 01分数规划+网络流

    题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...

  6. 【洛谷P2494】 [SDOI2011]保密(分数规划+最小割)

    洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间 ...

  7. 洛谷2494 [SDOI2011]保密 (分数规划+最小割)

    自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...

  8. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  9. 【BZOJ4819】新生舞会(分数规划,网络流)

    [BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...

随机推荐

  1. 一次永久解决cmd窗口汉字显示乱码

    对于编译出的程序,在 cmd 和 power shell 运行时都不能正确显示汉字. 网上查,可以再命令窗口修改: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码 ...

  2. 阿里Java面经大全(整合版)

    本文里的面经内容全部来源于牛客网,作为秋招备战复习与查缺补漏时使用.里面部分面经有我的注释和想法,以及部分解答,不一定正确,大家可以查询补充. 阿里巴巴,三面,java实习 昨天晚上11点打电话来,问 ...

  3. Spring Boot(十八):使用 Spring Boot 集成 FastDFS

    上篇文章介绍了如何使用 Spring Boot 上传文件,这篇文章我们介绍如何使用 Spring Boot 将文件上传到分布式文件系统 FastDFS 中. 这个项目会在上一个项目的基础上进行构建. ...

  4. linux下安装redis组件报错-gcc报错

    报错如图: 1.解决办法    先安装gcc插件.删除redis解压后文件.重新解压

  5. JSON.NET VS BinaryFormatter 性能

    近期有个性能调优工作.通过dottrace 分析,发现几处问题,其中json.net 在序列化和反序列化的时候也比较耗性能,所以考虑能不能通过其它序列化方式来提高性能. 1 object 序列化代码 ...

  6. PHP从入门到精通(一)

    (一)PHP简介和基本知识 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于 ...

  7. Python-文件操作—_19

    1,文件操作 模特主妇护士老师.txt 1,文件路径:d:\模特主妇护士老师.txt 2,编码方式:utf-8 gbk .... 3,操作方式:只读,只写,追加,读写,写读..... 以什么编码方式储 ...

  8. Kruskal算法-HDU1863畅通工程

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1863] 题意 Problem Description 省政府"畅通工程"的目标是使全 ...

  9. Linux内核分析第七周总结

    第七章 可执行程序的装载 可执行程序的生成 可执行程序的生成: c语言代码--->经过编译器的预处理--->编译成汇编代码--->由汇编器编译成目标代码--->链接成可执行文件 ...

  10. 3-palindrome CodeForces - 805B (思维)

    In the beginning of the new year Keivan decided to reverse his name. He doesn't like palindromes, so ...