开不开堆优化,吸不吸氧都0分
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <complex.h>
#include <fenv.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <tgmath.h>
using namespace std;
const int N=1e5+10,M=5e5+10;
int n,m,s,l,cnt=0,h[N],ne[M],w[M],e[M],dis[N];
bool st[N];
typedef pair<int,int> pii;
queue<pii>heap;
queue<int> a;
vector<int> ans[N];
stack<int> a1;
void add(int a,int b,int c)
{
e[cnt]=b;
ne[cnt]=h[a];
w[cnt]=c;
h[a]=cnt++;
return ;
}
void dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
pii f;
heap.push({0,s});
while(!heap.empty())
{
f=heap.front();
heap.pop();
if(st[f.second]==0)
{
int u=f.second;
st[u]=1;
int v=f.first;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(dis[j]>=v+w[i])
{
dis[j]=v+w[i];
heap.push({dis[j],j});
a.push(w[i]);
}
}
}
}
return ;
}
int main()
{
memset(h,-1,sizeof(h));
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
int num=1;
cnt=0;
cin>>s>>l;
dijkstra();
while(!a.empty())
{
int o=a.front();
if(cnt+o<=dis[l])
{
cnt+=o;
ans[num].push_back(o);
}
else
{
cnt=o;
ans[++num].push_back(cnt);
}
a.pop();
}
int lr=0,maxn=-1,maxx=-1;
for(int i=1;i<=num;i++)
{
int ttt=ans[i].size();
maxn=max(maxn,ttt);
}
for(int i=1;i<=num;i++)
{
int ttt=ans[i].size();
if(ttt!=maxn)
continue;
int cnt=1;
for(int j=0;j<ans[i].size();j++)
cnt*=ans[i][j];
if(cnt>maxx)
{
lr=i;
maxx=cnt;
}
}
for(int i=0;i<ans[lr].size();i++)
a1.push(ans[lr][i]);
double ansans=100.0;
while(!a1.empty())
{
int as=a1.top();
ansans=ansans/((1-0.01*as)*1.0);
a1.pop();
}
printf("%.8lf",ansans);
return 0;
}