MLE 求卡!难道是我们邻接表不行吗
查看原帖
MLE 求卡!难道是我们邻接表不行吗
339311
mori_楼主2023/10/23 19:32

关于标题:本人不会链前所以猜测是邻接表,但是用swap大法也MLE了所以可能是别的问题,但是找不出来了

//
//  Created by mori
//
//  Coded with Visual Studio Code
//

#include <bits/stdc++.h>
using namespace std;

#define pii pair <int, int>
typedef vector <int> vci;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;

#define rep(i, x, y) for (int i = (x); i <= (y); ++i)
#define per(i, x, y) for (int i = (x); i >= (y); --i)
#define cat const auto &
#define at auto &

template <typename T>
void ckmin (T &_0, T _1) { if (_1 < _0) _0 = _1; }

template <typename T>
void ckmax (T &_0, T _1) { if (_1 > _0) _0 = _1; }

int read () {
    int res = 0;
    bool f = false;
    char temp = getchar();
    for (; !isdigit(temp); temp = getchar()) f = temp == '-';
    for (; isdigit(temp); temp = getchar()) res = res * 10 + temp - '0';
    if (f) return -res;
    return res;
}

char gc () {
    char temp = getchar();
    while (temp == '\n' || temp == '\r' || temp == ' ') temp = getchar();
    return temp;
}

struct MODER {
    ll p, m;
    explicit MODER (ll tmp) : p (tmp), m (((lll)1 << 63) / p) {}
    ll operator () (ll x) {
        ll q = ((lll) x * m) >> 63;
        x -= p * q;
        if (x >= p) return x - p;
        return x;
    }
};

const string myfile = "iakioi";
void file () {
    string in = myfile + ".in", out = myfile + ".out";
    freopen(in.c_str(), "r", stdin); freopen(out.c_str(), "w", stdout);
}

constexpr int maxn = 1e5 + 5, inf = 1e9;
int n, m, k, p, dis[maxn], f[maxn][55];
MODER mod(12345);

struct EDGE {
    int v, w;
    operator int () const { return v; }
    EDGE (int vv, int ww) : v(vv), w(ww) {} 
};
vector <EDGE> e[maxn], e2[maxn];

void dist () {
    rep (i, 1, n - 1) dis[i] = inf;
    dis[n] = 0;
    priority_queue <pii> q; q.emplace(0, n);
    while (!q.empty()) {
        int u = q.top().second; q.pop();
        for (cat v : e[u])
            if (dis[v] > dis[u] + v.w)
                dis[v] = dis[u] + v.w, q.emplace(-dis[v], v);
    }
}

bool vis[maxn][55], noa;
int dfs (int u, int x) {
    if (x < 0 || x > k) return 0;
    if (f[u][x]) return f[u][x];
    if (vis[u][x]) { printf("-1\n"); noa = true; }
    vis[u][x] = true;
    if (u == n && x == 0) ++f[u][x];
    for (cat v : e2[u]) f[u][x] = mod((ll) f[u][x] + dfs(v, x - (dis[v] + v.w - dis[u])));
    vis[u][x] = false; return f[u][x];
}

signed main () {
    int T = read();
    while (T--) {
        n = read(), m = read(), k = read(), p = read(), mod = MODER(p);
        rep (i, 1, n) vector <EDGE> ().swap(e[i]), vector <EDGE> ().swap(e2[i]);
        rep (i, 1, m) {
            int u = read(), v = read(), w = read();
            e[v].emplace_back(u, w); e2[u].emplace_back(v, w);
        }
        memset(f, 0, sizeof f); noa = false;
        dist(); memset(vis, 0, sizeof vis); int ans = 0;
        rep (i, 0, k) ans = mod((ll) ans + dfs(1, i));
        if (!noa) printf("%d\n", ans);
    }
    return 0;
}
2023/10/23 19:32
加载中...