数据仍需加强
查看原帖
数据仍需加强
408805
tr2020楼主2024/7/15 10:34

SPFA水过,求hack

#include <cstdio>
#include <cstring>
#include <list>
#include <algorithm>
using namespace std;

#define N (10000 + 10)
#define K 100 + 10
#define inf 2139062143

struct edge_t
{
    int v, a;
};

list<edge_t> e[N];
int q[N * 100], l, r;
int f[N][K];

int main()
{
    int n, m, k;
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= m; i++)
    {
        int u, v, a;
        scanf("%d%d%d", &u, &v, &a);
        e[u].push_back((edge_t){v, a});
    }

    memset(f, 127, sizeof(f));
    f[1][0] = 0;
    q[r++] = 1;
    while (l < r)
    {
        int i = q[l++];
        for (auto nxt : e[i])
        {
            int j = nxt.v, a = nxt.a;
            bool flag = false;
            for (int t = 0; t < k; t++)
                if (f[i][t] != inf)
                {
                    int t2;
                    if (f[i][t] >= a)
                        t2 = f[i][t] + 1;
                    else
                        t2 = f[i][t] + (a - f[i][t]) / k * k +
                             ((a - f[i][t]) % k > 0) * k + 1;
                    if (t2 < f[j][t2 % k])
                    {
                        f[j][t2 % k] = t2;
                        flag = true;
                    }
                }
            if (flag)
                q[r++] = j;
        }
    }

    if (f[n][0] == inf)
        printf("-1\n");
    else
        printf("%d\n", f[n][0]);

    return 0;
}
2024/7/15 10:34
加载中...