比赛 4043级2023省选模拟赛9 评测结果 AAAAAAAAAA
题目名称 最小圈 最终得分 100
用户昵称 yrtiop 运行时间 0.006 s
代码语言 C++ 内存使用 2.43 MiB
提交时间 2023-03-30 09:59:31
显示代码纯文本
#include <bits/stdc++.h>
#define fir first
#define sec second
#define pb emplace_back
using pii = std::pair<int,double>;

const int maxn = 3e3 + 5;
std::vector<pii> G[maxn];
int n,m;
bool vis[maxn];
double x,dis[maxn];

bool SPFA(int u) {
	vis[u] = true;
	for(auto& p : G[u]) {
		int v = p.fir;
		double w = p.sec;
		if(dis[v] > dis[u] + w - x) {
			dis[v] = dis[u] + w - x;
			if(vis[v]||SPFA(v))
				return true;
		}
	}
	return vis[u] = false;
}

bool check() {
	for(int i = 1;i <= n;++ i)
		vis[i] = false,dis[i] = 0;
	for(int i = 1;i <= n;++ i)
		if(SPFA(i))
			return true;
	return false;
}

int main() {
	freopen("minicycle.in","r",stdin);
	freopen("minicycle.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i = 1;i <= m;++ i) {
		int u,v;
		double t;
		scanf("%d %d %lf",&u,&v,&t);
		G[u].pb(v , t);
	}
	double l = -1e7 - 5,r = 1e7 + 5;
	while(r - l >= 1e-9) {
		x = (l + r) / 2.0;
		if(check())
			r = x;
		else
			l = x;
	}
	printf("%.8lf\n",r);
	return 0;
}