欢迎光临散文网 会员登陆 & 注册

P1576 最小花费

2023-03-12 19:49 作者:仓鼠翞  | 我要投稿

//https://www.luogu.com.cn/problem/P1576?contestId=96630
//将2转化为0.98
//每次的汇率是相乘的关系
//边的边权就是汇率的乘机因为钱是越乘越少
//要求最少的钱就是求最大的汇率
#include<bits/stdc++.h>
using namespace std;
int n,m;//n是总人数,m是边数
double G[2001][2001];
int a,b;

bool visited[2001];
double dist[2001];
void Dijsktra(int x)
{
   fill(visited+1,visited+1+n,false);
   fill(dist+1,dist+1+n,-1);
   dist[x]=1.0;//最初的本金就是百分之百不变
   for(int i=1;i<=n;i++)
   {
       int u=-1;
       double max=-1;
       for(int j=1;j<=n;j++)
       {
           if(visited[j]==false&&dist[j]>max)
           {
               u=j;
               max=dist[j];//找到最大汇率
           }
       }
       if(u==-1) return;
       visited[u]=true;
       for(int v=1;v<=n;v++)
       {
           if(visited[v]==false&&G[u][v]!=0&&dist[v]<dist[u]*G[u][v])
           {
               dist[v]=dist[u]*G[u][v];
           }
       }
   }
}

int main()
{
   scanf("%d%d",&n,&m);
   fill(G[0],G[0]+2001*2001,0);
   for(int i=0;i<m;i++)
   {
       int u,v;
       double w;
       scanf("%d%d%lf",&u,&v,&w);
       G[u][v]=(100.0-w)/100.0;
       G[v][u]=(100.0-w)/100.0;
   }
   scanf("%d%d",&a,&b);
   Dijsktra(a);
   double ans=100.0/dist[b];
   printf("%.8f",ans);
}

P1576 最小花费的评论 (共 条)

分享到微博请遵守国家法律