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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞