图论(网络流):[CTSC2001]终极情报网
[CTSC2001]终极情报网
【题目描述】

在最后的诺曼底登陆战开始之前,盟军与德军的情报部门围绕着最终的登陆地点展开了一场规模空前的情报战。
这场情报战中,盟军的战术是利用那些潜伏在敌军内部的双重间谍,将假的登陆消息发布给敌军的情报机关的负责人。那些已经潜入敌后的间谍们都是盟军情报部的
精英,忠实可靠;但是如何选择合适的人选,以及最佳的消息传递方法,才能保证假消息能够尽快而且安全准确地传递到德军指挥官们的耳朵里,成了困扰盟军情报
部长的最大问题。他需要你的帮助。
以下是情报部长提供的作战资料:
在敌后一共潜伏着我方最优秀的N(N<=300)名间谍,分别用数字1, 2, …, N编号。在给定的作战时间内,任意两人之间至多只进行一次点对点的双人联系。
我将给你一份表格,表格中将提供任意两位间谍i和j之间进行联系的安全程度,用一个 [0, 1] 的实数Si j表示;以及他们这次联系时,能够互相传递的消息的最大数目,用一个正整数表示Mi j (如果在表格中没有被提及,那么间谍i和j之间不进行直接联系)。
假消息从盟军总部传递到每个间谍手里的渠道也不是绝对安全,我们用 [0, 1]
的实数ASj表示总部与间谍j之间进行联系的安全程度,AMj则表示总部和间谍j之间进行联系时传递的消息的最大数目。对于不和总部直接联系的间谍,他的
AMj=0(而表格中给出的他的ASj是没有意义的)。
当然,假消息从间谍手中交到敌军的情报部官员的办公桌上的过程是绝对安全的,也即是说,间谍与敌军情报部门之间要么不进行直接联系,要么其联系的安全程度是1(即完全可靠)。
现在情报部打算把K条假消息“透露”到德军那里。消息先由总部一次性发给N名间谍中的一些人,再通过他们之间的情报网传播,最终由这N名间谍中的某些将情报送到德军手中。
对于一条消息,只有安全的通过了所有的中转过程到达敌军情报部,这个传递消息的过程才算是安全的;因此根据乘法原理,它的安全程度P就是从总部出发,经多次传递直到到达德军那里,每一次传递该消息的安全程度的乘积。
而对于整个计划而言,只有当N条消息都安全的通过情报网到达德军手中,没有一条引起怀疑时,才算是成功的。所以计划的可靠程度是所有消息的安全程度的乘积。
显然,计划的可靠性取决于这些消息在情报网中的传递方法。
我需要一个方案,确定消息应该从哪些人手中传递到哪些人手中,使得最终计划的可靠性最大。
你可以利用计算机,来求得这个最可靠的消息传递方案。
【输入格式】
第一行包括两个整数N(N<=300)和K,分别是间谍的总人数和计划包含的消息总数。
第二行包括2N个数,前N个数是实数AS1, AS2, …, ASN(范围在[0, 1]以内);后N个数是整数AM1, AM1, …, AMN。
第三行包含了N个整数,其中第i(i = 1, 2, …, N)个整数如果为0表示间谍i与德军情报部不进行联系,如果为1则表示间谍与德军情报部进行联系。
第四行开始,每行包括4个数,依次分别是:代表间谍编号的正整数i和j,间谍i和j联系的安全性参数Si j([0,1]范围内的实数),以及i、j之间传递的最大消息数 Mi j(每一行的i均小于j )。
最后的一行包含两个整数-1 -1,表示输入数据的结束。
0
【输出格式】
只有一行。这一行中包含一个实数P,给出的是整个计划的可靠程度P,保留5位有效数字(四舍五入)。
如果情报网根本不能将K条消息传到德军手中,那么计划的可靠性为0。
(你可以假定,如果计划存在,那么它的可靠性大于1e-12)
【样例输入】
6 13
0.9 0.7 0.8 0 0 0 2 6 8 0 0 0
0 0 0 1 0 1
1 4 0.5 2
2 3 0.9 5
2 5 0.8 2
2 6 0.8 7
3 5 0.8 2
5 6 0.8 4
-1 -1
【样例输出】
0.00021184 费用流的变形。
竟然卡精度,OI赛制下会害死一片人。 这个程序过不了BZOJ的评测,这和其运行环境有关(COGS上AC了)。
所以考场上我咋知道这道题咋写才不会WA?OI有时难在运气上……
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=;
const int maxm=;
const double eps=1e-;
const int INF=;
int cnt=,fir[maxn],path[maxn];
int n,k,to[maxm],nxt[maxm],cap[maxm]; long double val[maxm],dis[maxn]; void addedge(int a,int b,int c,double v){
nxt[++cnt]=fir[a];
fir[a]=cnt;
cap[cnt]=c;
val[cnt]=v;
to[cnt]=b;
} queue<int>q;
int vis[maxn];
long double BFS(int S,int T){
vis[S]=;q.push(S);
for(int i=S+;i<=T;i++)
dis[i]=;dis[S]=;
while(!q.empty()){
int x=q.front();q.pop();vis[x]=;
for(int i=fir[x];i;i=nxt[i])
if(cap[i]&&eps<dis[x]*val[i]-dis[to[i]]){
dis[to[i]]=dis[x]*val[i];
if(!vis[to[i]])q.push(to[i]);
vis[to[i]]=;path[to[i]]=i;
}
}
return dis[T];
} int Aug(int S,int T){
int f=INF,p=T;
while(p!=S){
f=min(f,cap[path[p]]);
p=to[path[p]^];
}
p=T;
while(p!=S){
cap[path[p]]-=f;
cap[path[p]^]+=f;
p=to[path[p]^];
}
return f;
} long double MCMF(int S,int T){
int f,totf=;
long double ret=1.0,d;
while((d=BFS(S,T))>eps){
f=Aug(S,T);totf+=f;
while(f--)ret*=d;
}
return totf==k?ret:0.0;
} void Print(long double ans){
char s[];
sprintf(s,"%.15Lf\n",ans);
int p=,tot=;
while(tot<){
if(s[p]!=''&&s[p]!='.'||tot)
tot+=;
p++;
}
if(s[p]>='')s[p-]+=;
s[p]='\000';printf("%s",s);
} int C[maxn];
long double P[maxn];
int main(){
#ifndef ONLINE_JUDGE
freopen("agent.in","r",stdin);
freopen("agent.out","w",stdout);
#endif
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%Lf",&P[i]);
for(int i=;i<=n;i++)scanf("%d",&C[i]); for(int i=;i<=n;i++){
if(C[i]>&&P[i]>eps){
addedge(n+,i,C[i],P[i]);
addedge(i,n+,,/P[i]);
}
}
for(int i=,c;i<=n;i++){
scanf("%d",&c);
if(c>){
addedge(i,n+,INF,);
addedge(n+,i,,);
}
} int a,b,c;
long double p;
while(true){
scanf("%d%d",&a,&b);
if(a==-&&b==-)break;
scanf("%Lf%d",&p,&c);
addedge(a,b,c,p);
addedge(b,a,,/p);
addedge(b,a,c,p);
addedge(a,b,,/p);
}
addedge(,n+,k,);
addedge(n+,,,);
long double ans=MCMF(,n+);
if(ans>eps)Print(ans);
else printf("0\n");
return ;
}
图论(网络流):[CTSC2001]终极情报网的更多相关文章
- BZOJ2542: [Ctsc2001]终极情报网
题解: 乘积最小只需要取对数.然后反向边就变成1/c,而不是-c了. 精度问题搞得我已经我想说什么了... 贴一份网上的pascal 代码: type ss=record x,y,c,r,next:l ...
- bzoj 2542: [Ctsc2001]终极情报网 费用流
题目链接 2542: [Ctsc2001]终极情报网 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 321 Solved: 125[Submit][S ...
- 题解 洛谷 P5814 【[CTSC2001]终极情报网】
读完题后不难看出本题是个网络流模型,源点流出的总流量为\(k\),源点向每个和总部直接联系的间谍连边,每个间谍向其能传递的间谍连容量为\(m\)的边,能与德军情报部进行联系的间谍向汇点连容量为\(in ...
- 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)
Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...
- 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)
题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- 图论--网络流--最大流 洛谷P4722(hlpp)
题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...
- 图论--网络流--费用流POJ 2195 Going Home
Description On a grid map there are n little men and n houses. In each unit time, every little man c ...
- 图论--网络流--费用流--POJ 2156 Minimum Cost
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
随机推荐
- @ManyToMany中间表附加字段设计
在使用@ManyToMany时,若中间表只有相应的外键字段可以直接建立两个对应的Entity 设置ManyToMany @ManyToMany 两个表多对多关联 但若是中间表有自己的附加字段,这需要为 ...
- 用CSS+Jquery实现一个漂浮的窗体
一.项目需求: 实现一个用于网站主页面 从窗体左上角开始飘到右下角 之后又飘到右上角 十秒之后消失的效果. 二.需求分析: 首先 应当想要漂浮的内容放在一个容器内,也就是一个DIV,设计它的样式,不管 ...
- memcached并发处理
memcached(十八)并发原语CAS与GETS操作 Memcached 并发控制 CAS 协议 memcache控制高并发问题 使用memcached进行并发控制 memcached的最佳实践方案
- WisDom.Net 框架设计(二) 服务总线
WisDom.Net 框架设计--服务总线 1.Soa 简介 soa 就是面向服务的体系结构 是一个组件模型,不同的组件之间通过定义良好的接口联系起来.就像盖房子一块砖头一块砖头的砌墙,一片一 ...
- C#中的Dictionary字典类介绍
Dictionary字典类介绍 必须包含名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是 ...
- .NET 4.6
http://referencesource.microsoft.com/ DownLoad 下载原代码
- Android布局管理器(线性布局)
线性布局有LinearLayout类来代表,Android的线性布局和Swing的Box有点相似(他们都会将容器里面的组件一个接一个的排列起来),LinearLayout中,使用android:ori ...
- Core Data 教学
看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程 ...
- 添加Pods后,import无提示的解决办法
选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...
- java通过移位转16进制
public class Main { public static void main(String []args) { Main main = new Main(); System.out.prin ...