最小花费
题目大意:
n个人,一些人之间可以相互转账,但又手续费x%,问A转给B100元至少要多少钱
样例输入
3 3
1 2 1
2 3 2
1 3 3
1 3
样例输出
103.07153164
数据范围限制
对于所有数据, 1 <= n <=2000。
解题思路:
这道题Floyed是肯定不行的,我们就用Dijkstra,首先用公式求出利润率,然后最长路(是相乘的),然后用100除以结果
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int w,n,m,x,y,h,p[2005],head[2005];
double c,maxx,b[2005];
struct rec
{int to,next;double l;
}a[4000005];
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=m;++i){scanf("%d %d %lf",&x,&y,&c);a[++w].to=y;a[w].l=(100-c)/100;a[w].next=head[x];head[x]=w;a[++w].to=x;a[w].l=(100-c)/100;a[w].next=head[y];head[y]=w;}scanf("%d %d",&x,&y);for (int i=head[x];i;i=a[i].next)b[a[i].to]=a[i].l;p[x]=1;b[x]=1;for (int i=2;i<n;++i){maxx=0;h=0;for (int j=1;j<=n;++j)if (!p[j]&&b[j]>maxx){maxx=b[j];h=j;}if (!h) break;p[h]=1;for (int i=head[h];i;i=a[i].next)if (!p[a[i].to]&&b[h]*a[i].l>b[a[i].to])b[a[i].to]=b[h]*a[i].l;}printf("%.8lf",100/b[y]);return 0;
}