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;
}
posted @ 2018-11-19 22:27  bztMinamoto  阅读(173)  评论(0编辑  收藏  举报
Live2D