rt,输出和答案相差不大,差了 0.01∼0.03
#include<bits/stdc++.h>
#define reg register
using namespace std;
inline int read()
{
int x=0;
short f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
vector<int>e[1010];
vector<double>v2[1010],v1[1010];
int n,m,x,cnt[1010],dis[1010];
double l=0,r=1e12,eps=1e-6,mid,v[1010];
inline bool spfa()
{
queue<int>q;q.push(1);
while(q.size())
{
int u=q.front();q.pop();
// printf("cnt[%d]=%d\n",u,cnt[u]);
for(reg int i=0;i<e[u].size();i++)
{
if(dis[e[u][i]]>dis[u]+v2[u][i])
{
dis[e[u][i]]=dis[u]+v2[u][i];
q.push(e[u][i]);cnt[e[u][i]]=cnt[u]+1;
if(cnt[e[u][i]]>=n) return 1;
}
}
}
return 0;
}
inline bool check(double x)
{
// cout<<"mid="<<x<<endl;
for(reg int i=1;i<=n;i=-~i)
{
v2[i].clear();cnt[i]=0;dis[i]=i==1?0:0x3f3f3f3f;
// cout<<cnt[i]<<' '<<dis[i]<<endl;
for(reg int j=0;j<e[i].size();j=-~j) v2[i].push_back(x*v1[i][j]-v[i]);
}
return spfa();
}
signed main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
n=read();m=read();
for(reg int i=1;i<=n;i=-~i) v[i]=read();
for(reg int i=1;i<=m;i=-~i) x=read(),e[x].push_back(read()),v1[x].push_back(read());
while(l+eps<r)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.2lf\n",(check(l)?l:r));
// for(reg int i=1;i<=n;i=-~i) for(reg int j=0;j<e[i].size();j=-~j) printf("dis[%d][%d]=%.0lf\n",i,e[i][j],v1[i][j]);
return 0;
}