记录编号 322973 评测结果 AAAAAAAAAA
题目名称 最小花费 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.249 s
提交时间 2016-10-15 19:49:56 内存使用 17.93 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=500010;
  5. struct edge{int f,t;double l;}w[N];
  6. int n,m,head[N],tail[N],next[N];
  7. inline void add(int f,int num){
  8. if (!head[f]) head[f]=tail[f]=num;
  9. else tail[f]=next[tail[f]]=num;
  10. }
  11. double dis[N];bool vis[N];
  12. int main()
  13. {
  14. freopen("moneyb.in","r",stdin);
  15. freopen("moneyb.out","w",stdout);
  16. scanf("%d%d",&n,&m);
  17. for (int i=1;i<=m;i++){
  18. scanf("%d%d%lf",&w[i].f,&w[i].t,&w[i].l);
  19. w[i].l=(100-w[i].l)/100;
  20. w[i+m]=w[i];swap(w[i].f,w[i].t);
  21. add(w[i].f,i);add(w[i].t,i+m);
  22. }
  23. int s,t;
  24. scanf("%d%d",&s,&t);
  25. for (int i=1;i<=n;i++) dis[i]=1e+9;
  26. dis[s]=100;
  27. while (1){
  28. int v=0;
  29. for (int i=1;i<=n;i++)
  30. if (!vis[i]&&(!v||dis[i]<dis[v])) v=i;
  31. if (!v) break;
  32. vis[v]=1;
  33. for (int i=head[v];i;i=next[i])
  34. if (dis[w[i].t]>dis[v]/w[i].l)
  35. dis[w[i].t]=dis[v]/w[i].l;
  36. }
  37. printf("%.8lf\n",dis[t]);
  38. return 0;
  39. }