最小花费

这是一道最短路的裸题,但从寒假开始做,暑假才通过,可以看出有两点不足

1.态度不端正,有题没有过应该非常着急的去把它完成,如果是抱着学知识的态度,就不会去着急得刷太多的题目,而是静下心来,一道一道做。

2.不细心,即使到了暑假,也是调了很久。把pair<double,int>写成pair<int,double>,建成小根堆,一是对板子不熟悉,二是一个一直有的毛病,写代码不动脑子,凭感觉。脑子是个好东西~

但也有收获,比如又熟悉了一遍Dijkstra的板子,还有要建立一个超级源点或者都加入队列(本题用不上)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 int n,m,A,B,num; 
 6 struct Edge{
 7     int next,to;
 8     double dis;
 9 }edge[200007];
10 int head[2007];
11 double d[2007];
12 bool vis[2007];
13 typedef pair<double,int>pii;
14 priority_queue<pii,vector<pii> >Q;
15 void add(int from,int to,double d){
16     edge[++num].next=head[from];
17     edge[num].to=to;
18     edge[num].dis=d;
19     head[from]=num;
20 }
21 int main(){
22     cin>>n>>m;
23     for(int i=1;i<=m;i++){
24         int u,v;double w;cin>>u>>v>>w;
25         w = (100-w)*0.01;
26         add(u,v,w);
27         add(v,u,w);
28     }
29     cin>>A>>B;
30     for(int i=1;i<=n;i++){
31         d[i]=0;
32     }
33     d[A]=1;
34     for(int i=1;i<=n;i++)
35         if(i!=A) Q.push(make_pair(0,i));
36     Q.push(make_pair(1,A));
37     while(!Q.empty()){
38         int u=Q.top().second;Q.pop();
39         if(vis[u]) continue; 
40         vis[u]=true;
41         for(int i=head[u];i;i=edge[i].next){
42             int v=edge[i].to;
43             if(vis[v]) continue;
44             if(d[v]<d[u]*edge[i].dis) {
45                 d[v]=d[u]*edge[i].dis;
46                 Q.push(make_pair(d[v],v));
47             }
48         }
49     }
50      printf("%.8lf",100/d[B]);
51      return 0;
52 } 
53 
54 //A最小->100/w,w要尽可能大->最长路 
原文地址:https://www.cnblogs.com/lcan/p/9355966.html