【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个女生参加舞会 买 ...
随机推荐
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 一个有趣的问题——HTTP是“超文本传输协议”还是“超文本转移协议”
最近在看<HTTP图解>这本书,书中提到了对国内对HTTP协议名称的翻译问题,并且给出了一些网友讨论的原稿链接,我看了一下觉得挺有意思的,另外我本人也觉得翻译对于理解协议本身非常重要,就整 ...
- Asp.Net MVC 获取当前 Controller Action Area
获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); 获取Action名称: ViewContext.Ro ...
- 总目录(Catalog)
总目录(Catalog) C#高级编程(C# advanced programming) 1.并发编程(Concurrent programming)(8) ...... 数据结构与算法(Data s ...
- EF_DataFrist遇到的问题
正在 Code First 模式下将此上下文与从 EDMX 文件生成的用于 Database First 或 Model First 开发的代码一起使用.这将无法正常工作.若要解决此问题,请不要删除引 ...
- 网络流第一题!!!BZOJ1001
歇逼了一晚上,懵懵懂懂的懂了Dinic算法 大概是一遍BFS+DFS,还不是很懂,明天继续看!!! #include<iostream> #include<stdio.h> # ...
- Visual Studio 2013编辑器+SourceTree代码管理工具及扩展工具
Visual Studio 2013: 美国微软公司的编辑开发工具 扩展工具: Resharper:进行深度代码分析,函数深度查询(ctrl+鼠标左): Grunt:是基于Node.js的项目以自动化 ...
- 个人作业 Last
对M1/M2阶段的总结 M1阶段的总结反思见我以前的博客,我以前曾经写过.现附上链接.http://www.cnblogs.com/jirufeng/p/4990245.html M2阶段主要是对我们 ...
- react-native 基础知识的学习
react已经用了半年多了,年后有时间想探究一下奇妙的react-native,还别说确实刁,具体哪里刁后面会补充,因为搭建教程,以及入门教程没来得及写,这里先来写一些基础知识的心得. 为什么reac ...
- git学习笔记——廖雪峰git教程
OK,先附上教程--廖雪峰的官方网站 友情连接:git官网 简介 这里我只想引用他的原文: Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的.实际情况是这样的: L ...