Mission Impossible

Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 227    Accepted Submission(s): 106
Special Judge

Problem Description
I.M.F.(Impossible
Missions Force) is a top secret spy organization in U.S. Ethan Hunt
have serviced in this organization for many years. Now, he is retired
and serves as a spy in a big company. Although he is very excellent, he
would make mistakes. For example, last time he invaded another company
to find some programming code. When he risked his life to steal the last
few pages of the code, he found that all of the letters on them are
only “}”. His boss is very angry. So, Ethan must finish this new mission
and he needs your help.

In
this new mission, Ethan successfully gets a big file in a computer and
decided to send this file from this computer to his boss’s computer
though the internet. We can assume the file is made of C small parts and
Ethan could only send one part each unit time.

The network
consists of n (n <= 200) computers, Ethan sits next to computer 1,
his boss sits next to computer 2. There exists a probability p[i][j]
between computer i and computer j, which means the probability of
successfully transferring each part from i to j is p[i][j]. However, all
of these links in the network are unidirectional (i.e. p[i][j] may be
different from p[j][i]). We defined the e[i][j] as the expected time to
send each part from i to j. For example, if p[i][j] = 10%, e[i][j] = 10
units.

You
may find that the probability would be very tiny and the expected time
could be very large since the route may be extremely long. Fortunately,
Ethan knows that he has m teammates sit next to several computers. He
can choose these computers as storage to shorten the transferring time.
(i.e. each of the n computers could be used as node
in any route, but only these m computers could be used as storages. Each
attempt to send a small part, successful or unsuccessful, takes
exactly one unite time, regardless of the number of links on the route.) So, he can do this mission as follows:

    • Choose a computer which includes the file (i.e. C parts of information) as computer u.
    • Choose
      another computer his boss or some teammate sits next to as computer v,
      and then takes time to transfer the file from u to v. If any part fails
      to be transferred, it will be resent immediately.
    • When the file is sent to his boss’s computer, the mission is finished.

To
satisfy his boss, Ethan must choose a route to make the total expected
time from computer 1(the computer near him) to computer 2(the computer
near his boss) minimum. You need to tell Ethan the minimum total
expected time.

It is an impossible mission aha? Why not have a try. It’s easier than expected.

 
Input
The first line contains an integer T, which means there are T test cases. Each test case is preceded by a blink line.

In
each test case, you know n (2 <= n <= 200), which means the
number of computers. Then an n*n matrix p(n) is following. p[i][j] means
the probability of successfully transferring each part from i to j. You
may assume that 0 <= p[i][j] <= 100.

Next line contains m
(m <= n) means there are m computer that could serve as storage (i.e.
the number of computers near Ethan, his teammates or his boss). Then a
line contains m integer shows these computers. You may assume that it
must contains computer 1 and computer 2.

The last line tells you there C parts in the big file. C is an integer which insure the answer is less than 1 000 000 000.

 
Output
For
each test case, you need to output a single line which contains the
minimum expected time of the transfer when Ethan chooses the best way to
finish his mission.

You’d better (not must) make the answer
rounded to 7 decimal places. Your answer would be considered correct if
each number has an absolute or relative error less than 10^-6.

 
Sample Input
2

5
0 1 20 0 0
0 0 0 0 0
0 0 0 50 90
0 20 0 0 0
0 0 0 90 0
3
1 2 5
10

4
0 100 0 0
100 0 100 0
0 100 0 100
0 0 100 0
0
1

 
Sample Output
111.111111
1.000000
感概:这题意我真是看了3遍啊!说明我这英语真是差啊,还不知道明天四级过的了不?
题意:求将文件从起点到终点通过中转站所学需要的最小的 期望时间。先求一个文件所需要的时间。题目给出了任意两点的成功率p。我们可以通过负二项分布成功一次的期望公式1/p,求出中转站任意两点的期望(PS:这里的期望是相加的,因为从i到j的这件情况与j到k的这种情况是无关的所以可以相加)。之后求出起点到终点最小期望再乘以文件数量即得所求。
收获:1.int型 * 1.0 可以转换为 double;
   2.folyd 既可以求出两点的最短路还可以求出最长路;
   3.负二项分布情况出现一次的期望公式 若这个情况发生的概率为p,那么这种情况出现一次的期望为1/p。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
using namespace std; const int INF=0x3f3f3f3f;
const double eps=1e-;
const double PI=acos(-1.0);
#define maxn 500
double p[maxn][maxn];
double temp[maxn][maxn];
int sto[maxn];
int n, m;
void folyd_probability()
{
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
if ((i==j) || (j==k) || (i==k)) continue;
p[i][j] = max(p[i][j], p[i][k]*p[k][j]);
}
}
void folyd_expect()
{
for(int k = ; k < m; k++)
for(int i = ; i < m; i++)
for(int j = ; j < m; j++)
{
if ((sto[i]==sto[j]) || (sto[j]==sto[k]) || (sto[i]==sto[k])) continue;
if (p[sto[i]][sto[k]]>= && p[sto[k]][sto[j]]>= && (p[sto[i]][sto[j]]< || p[sto[i]][sto[j]]>p[sto[i]][sto[k]]+p[sto[k]][sto[j]]))
{
p[sto[i]][sto[j]] = p[sto[i]][sto[k]] + p[sto[k]][sto[j]];
}
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
scanf("%lf", &p[i][j]);
p[i][j] = p[i][j]/100.0;
}
folyd_probability(); scanf("%d", &m);
for(int i = ; i < m; i++)
scanf("%d", &sto[i]);
int i;
for(i = ; i < m; i++)
if(sto[i] == )
break;
if(i == m)
sto[m++] = ;
for(i = ; i < m; i++)
if(sto[i] == )
break;
if(i == m)
sto[m++] = ; for(i = ; i < m; i++)
for(int j = ; j < m ;j++)
{
temp[sto[i]][sto[j]] = p[sto[i]][sto[j]];
if(temp[sto[i]][sto[j]] < eps)
p[sto[i]][sto[j]] = -;
else
p[sto[i]][sto[j]] = 1.0/temp[sto[i]][sto[j]];
} folyd_expect();
int c;
scanf("%d", &c);
printf("%.6lf\n", p[][] * c);
}
return ;
}
 
 

HDU3994(Folyd + 期望概率)的更多相关文章

  1. HDU 3853 期望概率DP

    期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y ...

  2. 【BZOJ 3652】大新闻 数位dp+期望概率dp

    并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...

  3. 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基

    大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...

  4. 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学

    神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...

  5. 【NOIP模拟赛】黑红树 期望概率dp

    这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...

  6. BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯

    这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...

  7. BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp

    首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...

  8. 期望概率DP

    期望概率DP 1419: Red is good ​ Description ​ 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...

  9. LightOJ 1030 Discovering Gold(期望 概率)

    正推,到达i的概率为p[i],要注意除了1和n外,到达i的概率并不一定为1 概率表达式为p[i] += p[j] / min(n - j, 6) 从j带过来的期望为exp[i] += exp[j] / ...

随机推荐

  1. 【BBST 之伸展树 (Splay Tree)】

    最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ...

  2. c++ windows下declspec

    一.declspec #ifdef STATIC_LIBS #define DLL_API static #else #define DLL_API __declspec (dllexport) #e ...

  3. Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)

    Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...

  4. map的类型映射

    以下是使用STL中map类型,对类型的转换示例,主要可以解决的问题,也就是一般的类型之间的相互转换,可以较好的解决相关的问题. 以下是C++源码,比较简短,容易理解的. #include " ...

  5. STL中map,set的基本用法示例

    本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...

  6. JQuery 1.3.2联动获取部门

    Sql       $(document).ready(function(){ $(".dept").bind("click", function () { v ...

  7. 注册界面设计及实现之(三)SharedPerferences实现数据暂存

    开发步骤: 创建一个SharedPerferences接口对象,并使用其putString方法放入相关的公共数据 将验证通过的注册账号写入到该文件中 将数据进行提交 给出客户提示 //Register ...

  8. XtraReport改变纸张方向

    XtraReport纸张方向改变可以通过修改Landscape属性: Landscape=true 为横向输出 Landscape=false 为纵向输出

  9. PHP学习笔记二十五【类的继承】

    <?php //定义父类 class Stu{ public $name; protected $age; protected $grade; private $address;//私有变量不会 ...

  10. javaScript增加样式规则(新增样式)

    <html> <head> <link rel="stylesheet" type="text/css" href="b ...