1. 程式人生 > >洛谷 P1576 最小花費

洛谷 P1576 最小花費

-s 正整數 描述 直接 oid ios org badge color

P1576 最小花費

題目描述

在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裏扣除百分之幾的手續費,請問A最少需要多少錢使得轉賬後B收到100元。

輸入輸出格式

輸入格式:

第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。

以下m行每行輸入三個正整數x,y,z,表示標號為x的人和標號為y的人之間互相轉賬需要扣除z%的手續費 (z<100)。

最後一行輸入兩個正整數A,B。數據保證A與B之間可以直接或間接地轉賬。

輸出格式:

輸出A使得B到賬100元最少需要的總費用。精確到小數點後8位。

輸入輸出樣例

輸入樣例#1: 復制
3 3                                     
1 2 1
2 3 2
1 3 3
1 3
輸出樣例#1: 復制
103.07153164

說明

1<=n<=2000,m<=100000

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 200010 
using
namespace std; int vis[2001]; int n,m,s,t,tot; double cap[MAXN*1],dis[2001]; int to[MAXN*2],net[MAXN*2],head[2001]; void add(int u,int v,double w){ to[++tot]=v;net[tot]=head[u];cap[tot]=1.0-w;head[u]=tot; } void spfa(int s){ queue<int>que; que.push(s);dis[s]=1;vis[s]=1; while
(!que.empty()){ int now=que.front(); que.pop();vis[now]=0; for(int i=head[now];i;i=net[i]) if(dis[to[i]]<dis[now]*cap[i]){ dis[to[i]]=dis[now]*cap[i]; if(!vis[to[i]]){ vis[to[i]]=1; que.push(to[i]); } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,(double)z/100); add(y,x,(double)z/100); } scanf("%d%d",&s,&t); spfa(s); printf("%.8lf",100/dis[t]); }

洛谷 P1576 最小花費