社区讨论

求调玄关

P3199[HNOI2009] 最小圈参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjxlphn7
此快照首次捕获于
2026/01/03 09:05
2 个月前
此快照最后确认于
2026/01/06 11:25
上个月
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 3010;
vector<pair<int,int>> G[N];
int dis[N];
bool vis[N];
    int n,m;
bool SPFA(int u, double mid) { 
  vis[u] = 1;
  for (auto x : G[u]) {
    int v = x.first;
    double w = x.second - mid;
    if (dis[u] + w < dis[v]) {
      dis[v] = dis[u] + w;
      if (vis[v] || SPFA(v, mid)) return 1;
    }
  }
  vis[u] = 0;
  return 0;
}

bool check(double mid) {  
  for (int i = 1; i <= n; i++) dis[i] = 0, vis[i] = 0;
  for (int i = 1; i <= n; i++)
    if (SPFA(i, mid)) return 1;
  return 0;
}
signed main(){
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);

    cin>>n>>m;
    for(int i = 1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back({v,w});
    }
    for(int i = 1;i<=n;i++){
        G[0].push_back({i,0});
    }
    double l = 0,r = 1e10;
    while(r-l>=1e-9){
        double mid = (l+r)/2.0;
        if(!check(mid)){
            l = mid;
        }else{
            r = mid;
        }
    }
    printf("%.8lf",r);
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...