题目链接:https://cn.vjudge.net/contest/208908#problem/M
大致题意:给你n个城市编号为0~n-1,这n个城市由m个边连接,你初始在0点,让你将s份资料送到n-1号城市,每次只能传送一份,每传送一份需要花费2*k秒的固定时间,路的长短和花费的时间没有关系,每条边有一个概率p,表示走这条路能将文件传送成功的概率,问你花费的最小时间的期望。
题目解答:期望公式一定是总时间/总的传送成功的概率,呢我们要花费时间最小,呢就是传送成功的概率最大,因此我们找到一条路使得传送的成功率最大即可,因为固定起点和终点,很容易想到bellman算法是最合适不过了,跑一发,求一个最大成功概率即可。
#include<stdio.h>
long long n,m,s,k;
double d[105];
struct node
{
int u,v;
double p;
}a[10005];
int main(void)
{
int T,i,j,cases=0;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld",&n,&m,&s,&k);
for(i=1;i<n;i++)
d[i]=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%lf",&a[i].u,&a[i].v,&a[i].p);
a[i].p/=100.0;
}
d[0]=1;
for(i=1;i<=n-1;i++)
for(j=1;j<=m;j++)
{
int x=a[j].u;
int y=a[j].v;
if(d[x]*a[j].p>d[y] && d[x]>0)
d[y]=d[x]*a[j].p;
if(d[y]*a[j].p>d[x] && d[y]>0)
d[x]=d[y]*a[j].p;
}
k=2*k*s;
//printf("%.4f\n",d[n-1]);
printf("Case %d: %.7f\n",++cases,(double)k/d[n-1]);
}
return 0;
}