Sending Packets (概率+bellman ford)

题目链接: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;
}
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/haut_ykc/article/details/79181201
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞