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

洛谷 P1576 最小花費 dijkstar

bool sin int 輸出格式 break bar ons ace main

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;
const int N=2010;
const int Maxn=99999999;

double a[N][N];
double
dis[N]; double min_dis; double w; bool vis[N]; int n,m,u,v,start,endd,min_k; inline int read() { int x=0;char c=getchar();int f=1; while(c<0||c>9){if(c==-)f=-1;c=getchar();} while(c>=0&&c<=9)x=x*10+c-0,c=getchar(); return x*f; } void dijkstar() { for
(int i=1;i<=n;i++) dis[i]=a[start][i]; dis[start]=1; vis[start]=1; for(int i=1;i<n;i++) { min_dis=0; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]>min_dis) min_dis=dis[j], min_k=j; vis[min_k]=1; if(min_k==endd) break; for(int j=1;j<=n;j++) if(!vis[j]&&dis[min_k]*a[min_k][j]>dis[j]) dis[j]=dis[min_k]*a[min_k][j]; } } int main() { freopen("moneyb.in","r",stdin); freopen("moneyb.out","w",stdout); n=read(); m=read(); for(int i=1;i<=m;i++) u=read(), v=read(), scanf("%lf",&a[u][v]), a[u][v]=(100-a[u][v])/100, a[v][u]=a[u][v]; start=read(); endd=read(); dijkstar(); printf("%.8lf",100/dis[endd]); return 0; }

洛谷 P1576 最小花費 dijkstar