P3199 [HNOI2009]最小圈
据rqy说有这么一个结论$$ans=\min_{v \in V,F_n(v)\neq \infty} \max_{0 \leq k \leq n - 1} \left[\frac{F_n(v)-F_k(v)}{n-k}\right]\qquad$$
其中新建一个节点\(S\)向所有点连边,\(F_i(v)\)表示从\(S\)开始经过恰好\(i\)条边到达\(v\)的最短路
代码里\(F\)的下标都减了\(1\)
//minamoto
#include<bits/stdc++.h>
#define rint register int
#define inf 1e12
using namespace std;
const int N=3005,M=10005;
double F[N][N],w[M];int u[M],v[M],n,m;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
for(rint i=1;i<=m;++i)scanf("%d%d%lf",&u[i],&v[i],&w[i]);
for(rint i=0;i<=n;++i)for(rint j=1;j<=n;++j)F[i][j]=i?inf:0;
for(rint i=0;i<n;++i)for(rint j=1;j<=m;++j)
F[i+1][v[j]]=min(F[i+1][v[j]],F[i][u[j]]+w[j]);
double ans=inf,ans1;
for(rint i=1;i<=n;++i)if(F[n][i]<1e11){
ans1=-inf;
for(rint j=0;j<n;++j)ans1=max(ans1,(F[n][i]-F[j][i])/(n-j));
ans=min(ans,ans1);
}
printf("%.8lf\n",ans);return 0;
}
深深地明白自己的弱小