HDU3994(Folyd + 期望概率)
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
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.
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.
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.
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
1.000000
#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 + 期望概率)的更多相关文章
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
- BZOJ2337: [HNOI2011]XOR和路径 期望概率dp 高斯
这个题让我认识到我以往对于图上期望概率的认识是不完整的,我之前只知道正着退还硬生生的AC做过的所有图,那么现在让我来说一下逆退,一般来说对于概率性的东西都只是正推,因为有了他爸爸才有了他,而对于期望性 ...
- BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...
- 期望概率DP
期望概率DP 1419: Red is good Description 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...
- LightOJ 1030 Discovering Gold(期望 概率)
正推,到达i的概率为p[i],要注意除了1和n外,到达i的概率并不一定为1 概率表达式为p[i] += p[j] / min(n - j, 6) 从j带过来的期望为exp[i] += exp[j] / ...
随机推荐
- 【HDU1754】I Hate It(线段树)
update:单点替换 query:区间最值 #include <iostream> #include <cstring> #include <cstdlib> # ...
- if条件语句练习(相亲)
public class a { public static void main(String[] arg){ //F是房子,Q是钱,N是能力,等于0说明没有,等于1说明有: 有一项具备则可以嫁,都不 ...
- facl笔记
文件系统访问列表:tom: tom, tom基本组jerry: other:r-- chown FACL:Filesystem Access Control List利用文件扩展保存额外的访问控 ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- LDA-线性判别分析(四)
本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...
- Java中随机数生成的两种方法,以及math的floor
1.Math的random方法,调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选 ...
- JS中面向对象的,对象理解、构造函数、原型、原型链
6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...
- TreeView中右击直接获取节点的方法
在TreeView中无法直接右击得到一个节点,因为当你选中其中一个右击时(不能是第一个)他会默认跳到第一个. 有时我们要想直接右击得到选中的节点,又时我们又想选中直接右击跳出一个快捷菜单怎么办了! 在 ...
- [转]eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
原网址 : http://www.cnblogs.com/zdz8207/archive/2012/11/30/eclipse-android-adt-update.html 网上解决方法主要有这几种 ...
- Winform中子线程访问界面控件时被阻塞解决方案
public partial class WebData_Import : Form { //声明用于访问主界面的委托类型 public delegate void deleGetOrderdata( ...