[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]终极情报网的更多相关文章

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

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

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

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

  3. 题解 洛谷 P5814 【[CTSC2001]终极情报网】

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

  4. 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)

    Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...

  5. 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

    题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...

  6. 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  7. 图论--网络流--最大流 洛谷P4722(hlpp)

    题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...

  8. 图论--网络流--费用流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 ...

  9. 图论--网络流--费用流--POJ 2156 Minimum Cost

    Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...

随机推荐

  1. oracle多表关联删除数据表记录方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  2. 第九篇:python高级之操作数据库

    python高级之操作数据库   python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...

  3. ASP.NET Boilerplate 工作单元

    从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...

  4. 全国OA系统下载地址(全)

    思道OAhttp://www.anyoffice.net微软.NET平台,支持64位 金和OAhttp://www.jinher.com 红帆OAhttp://www.ioffice.cn 致远OAh ...

  5. copssh加bitvise

    只是简单记录下自己在成功使用的方案: 目的:为了突破公司对网站和qq的限制 具备的条件:一台云服务器.Copssh_4.1.0.bitvise ssh client 4.62.公司电脑客户端 一.首先 ...

  6. 文字排版--字体(font-family)

    我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性.下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体. body{font-family:"宋体"; ...

  7. C#操作数据库,将其查查出来的记录条数显示在winform窗体中的方法之一

    //1.数据库链接的基本操作(略) //2.创建对象函数(关键部分) sqlConn.Open(); //初始化定义记录条数 ; object obj = sqlComm.ExecuteScalar( ...

  8. C#入门经典(第五版)学习笔记(三)

    ---------------面向对象编程简介--------------- UML表示方法: 1)方框上中下三分 2)上框写类名 3)中框写属性和字段,例如:+Description:string  ...

  9. print 函数的进一步理解

    没有括号的时候,pritn是列表操作符,会把其后列表里所有东西都数出来. 但是假如print后面紧跟着左括号,它就是一个函数调用,只会将括号内的东西输出来. “假如它看起来像函数调用,它就是一个函数调 ...

  10. getJSON回调函数不执行问题?

    利用getJSON异步请求时,回调函数不执行,不知道是什么问题? php 返回数据 header("Content-type:text/json"); echo json_enco ...