【BZOJ2285】[SDOI2011]保密(分数规划,网络流)
【BZOJ2285】[SDOI2011]保密(分数规划,网络流)
题面
题解
首先先读懂题目到底在干什么。
发现要求的是一个比值的最小值,二分这个最小值\(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]保密(分数规划,网络流)的更多相关文章
- BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】
题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...
- BZOJ2285 : [Sdoi2011]保密
首先通过分数规划,二分答案$mid$,将每条边边权重置为$t-mid\times s$,用DP求出终点到该点的最短路,若非正则可以更小. 如此可以计算出每个出入口的最小危险值,然后把奇点放在$S$,偶 ...
- 【XSY2718】gift 分数规划 网络流
题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...
- zju2676 Network Wars 分数规划+网络流
题意:给定无向图,每条边有权值,求该图的一个割集,是的该割集的平均边权最小 Amber的<最小割模型在信息学竞赛中的应用>中讲的很清楚了. 二分答案k,对每条边进行重新赋值为原边权-k,求 ...
- bzoj 1312: Hard Life 01分数规划+网络流
题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...
- 【洛谷P2494】 [SDOI2011]保密(分数规划+最小割)
洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间 ...
- 洛谷2494 [SDOI2011]保密 (分数规划+最小割)
自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- 【BZOJ4819】新生舞会(分数规划,网络流)
[BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...
随机推荐
- sessionStorage和localStorage的区别
JS的本地保存localStorage.sessionStorage用法总结 localStorage.sessionStorage是Html5的特性,IE7以下浏览器不支持 为什么要掌握localS ...
- [HAOI2017]方案数[组合计数、容斥、dp]
题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...
- C# 时间戳与DateTime互转
#region 转换时间为unix时间戳 /// <summary> /// 转换时间为unix时间戳 /// </summary> /// <param name=&q ...
- Android恶意样本数据集汇总
硕士论文的研究方向为Android恶意应用分类,因此花了一点时间去搜集Android恶意样本.其中一部分来自过去论文的公开数据集,一部分来自社区或平台的样本.现做一个汇总,标明了样本或数据集的采集时间 ...
- 虚拟机console基础环境配置——系统镜像站点配置
1. 概述2. 部署HTTP服务器2.1 YUM安装httpd2.2 配置httpd2.3 启动httpdf2.4 测试httpd3. 部署FTP服务器3.1 YUM安装vsftpd3.2 配置vsf ...
- kvm虚拟化关闭虚拟网卡virbr0的方法
我们知道:kvm虚拟化环境安装好后,ifconfig会发现多了一个虚拟网卡virbr0这是由于安装和启用了libvirt服务后生成的,libvirt在服务器(host)上生成一个 virtual ne ...
- 12.11 Daily Scrum
Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表. 邓亚梅 美化搜索框UI. 美 ...
- Linux内核分析 读书笔记 (第十八章)
第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1. ...
- 软件项目第一次Sprint总结
成果评分表: 组名 分数 原因 9-652 6 界面和谐生动,可运行,在目前阶段可时间基本操作 hzsy -2 代码下载,但实现安卓和相机调用 JYJe族 -1 实现安卓界面,完成一项功能,做得少 结 ...
- BF算法和KMP算法 python实现
BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...