洛谷P1576 最小花费

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int,double>pii;
 4 const int N=2005;
 5 const double inf=1e-5;
 6 int n,m,st,ed;
 7 double dis[N];
 8 vector<pii>G[N];
 9 struct cmp
10 {
11     bool operator ()(pii &a,pii &b)
12     {
13         return a.second<b.second;    
14     }    
15 };
16 void dijkstra()
17 {
18     dis[st]=1;
19     priority_queue<pii,vector<pii>,cmp>q;
20     q.push({st,dis[st]});
21     while(q.size())
22     {
23         auto p=q.top();
24         q.pop();
25         int u=p.first;
26         double d=p.second;
27         if(u==ed)break;
28         for(auto &vv:G[u])
29         {
30             int v=vv.first;
31             double w=vv.second;
32             if(double(d*(1-w))>dis[v])
33             {
34                 dis[v]=double(d*(1-w));
35                 q.push({v,dis[v]});
36             }
37         }
38     }
39     
40 }
41 int main()
42 {
43     
44     scanf("%d%d",&n,&m);
45     for(int i=1;i<=n;i++)dis[i]=inf;
46     for(int i=1;i<=m;i++)
47     {
48         int u,v,w;
49         scanf("%d%d%d",&u,&v,&w);
50         G[u].push_back({v,double(w)/100});
51         G[v].push_back({u,double(w)/100});
52     }
53     scanf("%d%d",&st,&ed);
54     dijkstra();//这里用的最大路径去模拟,初始值dis【i】全部初始化很小;
55     double ans=100/dis[ed];
56     printf("%.8lf",ans);//模拟过程,最后是dis[ed]*x=100,所以x=100/dis[ed]
57     return 0;
58 }

 

posted @ 2021-12-16 23:06  matt-11  阅读(88)  评论(0)    收藏  举报