比赛 |
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;
}