样例不过但 AC
查看原帖
样例不过但 AC
664034
_xxxxx_楼主2024/8/11 21:53

rt,对于 -1 没有判对,鉴定为没有 -1 的点,代码如下。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const double eps = 1e-5;
int head[N], ne[N], to[N], id, ty[N];
double w[N];
void add(int x, int y, double z, int tye)
{
    to[++id] = y, ne[id] = head[x], w[id] = z, ty[id] = tye, head[x] = id;
}
int n, s, t;
double dis[N];
int cnt[N];
bool vis[N];
bool SPFA(double now)
{
    for(int i = 0; i <= n; i++) dis[i] = -1e9, cnt[i] = 0, vis[i] = 0;
    queue<int> p;
    vis[n + 1] = 1;
    dis[n + 1] = 0;
    p.push(n + 1);
    while(!p.empty())
    {
        int u = p.front();
        p.pop();
        vis[u] = 0;
        for(int i = head[u]; i ; i = ne[i])
        {
            int v = to[i];
            double ws;
            if(ty[i] == 1) ws = log2(w[i] - now);
            if(ty[i] == 2) ws = -log2(w[i] + now);
            if(ty[i] == 3) ws = w[i];
            if(dis[v] < dis[u] + ws)
            {
                dis[v] = dis[u] + ws;
                cnt[v] = cnt[u] + 1;
                if(cnt[v] > n + 1) return 1;
                if(!vis[v]) vis[v] = 1, p.push(v);
            }
        }
    }
    return 0;
}
double l = 0, r = 10;
signed main()
{
    cin >> n >> s >> t;
    for(int i = 1; i <= s; i++)
    {
        int opt, x, y, k;
        cin >> opt >> x >> y >> k;
        add(y, x, k, opt);
        if(opt == 1) r = fmin(r, k);
    }
    for(int i = 1; i <= t; i++)
    {
        int c, k;
        cin >> c >> k;
        add(0, c, log2(k), 3);
        add(c, 0, -log2(k), 3);
    }
    for(int i = 0; i <= n; i++) add(n + 1, i, 0, 3);
    if(!SPFA(0)) return printf("-1"), 0;
    double ans = l;
    while(r - l > eps)
    {
        double mid = (l + r) / 2.0;
        if(SPFA(mid)) ans = mid, l = mid + eps;
        else r = mid - eps;
    }
    printf("%.5lf\n", ans);
    return 0;
}
2024/8/11 21:53
加载中...