读完题后不难看出本题是个网络流模型,源点流出的总流量为\(k\),源点向每个和总部直接联系的间谍连边,每个间谍向其能传递的间谍连容量为\(m\)的边,能与德军情报部进行联系的间谍向汇点连容量为\(inf\)的边,若最大流为\(k\),则存在可行的方案。

处理可靠程度最大时,考虑用费用流解决,将每条边的安全程度看作边的费用,进行最大费用最大流即可,注意反向边的费用应该为原边费用的倒数,实现时把平时的费用流的一些部分改为乘法即可。

一些细节看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 1000010
#define inf 1000000000
#define eps 1e-12
using namespace std;
typedef long double ld;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,k,S,s,t;
ld ans=1;
int am[maxn],d[maxn];
ld as[maxn],dis[maxn];
bool vis[maxn];
char str[30];
struct edge
{
int to,nxt,v;
ld c;
}e[maxn];
int head[maxn],edge_cnt=1;
void add(int from,int to,int val,ld cost)
{
e[++edge_cnt]=(edge){to,head[from],val,cost};
head[from]=edge_cnt;
e[++edge_cnt]=(edge){from,head[to],0,1/cost};
head[to]=edge_cnt;
}
bool spfa()
{
queue<int> q;
for(int i=s;i<=t;++i) dis[i]=0,vis[i]=d[i]=0;
q.push(s),dis[s]=1,d[s]=1,vis[s]=true;
while(!q.empty())
{
int x=q.front();
q.pop(),vis[x]=false;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,v=e[i].v;
ld c=e[i].c;
if(v&&dis[x]*c-dis[y]>eps)
{
dis[y]=dis[x]*c,d[y]=d[x]+1;
if(!vis[y]) vis[y]=true,q.push(y);
}
}
}
return dis[t];
}
int dfs(int x,int lim)
{
if(x==t) return lim;
int res=lim,flow;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,v=e[i].v;
ld c=e[i].c;
if(!v||dis[y]-dis[x]*c>eps||d[y]!=d[x]+1) continue;
if(flow=dfs(y,min(res,v)))
{
res-=flow;
e[i].v-=flow;
e[i^1].v+=flow;
if(!res) break;
}
}
return lim-res;
}
ld qp(ld x,int y)
{
ld v=1;
while(y)
{
if(y&1) v*=x;
x*=x,y>>=1;
}
return v;
}
void dinic()
{
int flow,sum=0;
while(spfa()>eps)
while(flow=dfs(s,inf))
sum+=flow,ans*=qp(dis[t],flow);
if(sum!=k) ans=0;
}
void print()
{
sprintf(str,"%.15Lf",ans);
int pos=0,cnt=0;
while(cnt<5)
{
char ch=str[pos++];
if((ch!='0'&&ch!='.')||cnt) cnt++;
}
if(str[pos]>='5') str[pos-1]+=1;
str[pos]=0;
for(int i=pos;i>=0;--i)
{
if(str[i]=='.') break;
if(str[i]>'9') str[i-1]++,str[i]='0';
}
printf("%s",str);
}
int main()
{
read(n),read(k),S=n+1,t=S+1,add(s,S,k,1);
for(int i=1;i<=n;++i) scanf("%Lf",&as[i]);
for(int i=1;i<=n;++i) read(am[i]);
for(int i=1;i<=n;++i)
if(am[i]&&as[i]>eps)
add(S,i,am[i],as[i]);
for(int i=1;i<=n;++i)
{
int v;
read(v);
if(v) add(i,t,inf,1);
}
while(1)
{
int x,y,m;
ld s;
read(x),read(y);
if(x==-1&&y==-1) break;
scanf("%Lf",&s),read(m);
add(x,y,m,s),add(y,x,m,s);
}
dinic();
if(ans>eps) print();
else puts("0");
return 0;
}

题解 洛谷 P5814 【[CTSC2001]终极情报网】的更多相关文章

  1. BZOJ2542: [Ctsc2001]终极情报网

    题解: 乘积最小只需要取对数.然后反向边就变成1/c,而不是-c了. 精度问题搞得我已经我想说什么了... 贴一份网上的pascal 代码: type ss=record x,y,c,r,next:l ...

  2. 图论(网络流):[CTSC2001]终极情报网

    [CTSC2001]终极情报网 [题目描述] 在最后的诺曼底登陆战开始之前,盟军与德军的情报部门围绕着最终的登陆地点展开了一场规模空前的情报战. 这场情报战中,盟军的战术是利用那些潜伏在敌军内部的双重 ...

  3. bzoj 2542: [Ctsc2001]终极情报网 费用流

    题目链接 2542: [Ctsc2001]终极情报网 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 321  Solved: 125[Submit][S ...

  4. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  5. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  6. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  7. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  8. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  9. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

随机推荐

  1. Spring 中Controller 获取请求参数的方法笔记

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...

  2. 高性能IO —— Reactor(反应器)模式

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式, 为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个 ...

  3. rodert单排学习redis进阶【白银一】

    redis之白银一 说些题外话,最近帝都疫情又严重,大家都身处时代洪流中,这不是个别人能左右的,希望你能保护好自己,天天开心. 前言 1.Redis 客户端 1.1.Redis Desktop Man ...

  4. RocketMQ入门到入土(二)事务消息&顺序消息

    接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...

  5. 记一次WIN10 WLAN消失修复

    事故现场:在win10自动更新后 在网路和Internet中WLAN消失 无法发现wifi了 设备管理器中wireless驱动上有黄色感叹号 解决办法: 右键有感叹号的wireless驱动,选择属性, ...

  6. 题解 P5937 【[CEOI1999]Parity Game】

    这道题有两种做法,一种是 扩展域(种类并查集),一种是 边带权(带权并查集).种类并查集貌似应该都比带权并查集简单,所以先讲种类并查集的做法,再讲带权并查集 种类并查集 若 sum[ l ~ r ] ...

  7. 模拟elementUI或使用自定义属性简单封装对话框

    前言 现在前端框架有许多的UI框架可以选择,但是样式或者功能不一定是我们项目中想要的,因此很多时候需要自己封装.此篇文件简单介绍一下利用自定义标签或者自定义扩展属性来封装UI组件,方便项目的其他地方复 ...

  8. 一个JSON解构赋值给另一个字段不同的JSON

    往数据里添加JSON字符串 // 往数据里添加JSON字符串 var arr = []; var json ={"name":"liruilong"," ...

  9. Mybatis一对一映射resultMap子标签中顺序问题

    直接上图 鼠标点上红线出现如下提示 The content of element type "resultMap" must match  "(constructor?, ...

  10. HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)

    嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...