P1948 dijkstra求调
查看原帖
P1948 dijkstra求调
524911
PassName楼主2022/8/4 08:32

一直输出 -1,求助!

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 1e3 + 5;
const int M = 2e4 + 5;

int n, m, k;
int h[N], e[M], w[M], ne[M], idx;
priority_queue<pair<int, int>> q;
int dist[N];
bool v[M];

void add(int a, int b, int c)
{
    e[++idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
}

bool dijkstra(int x)
{
    memset(v, false, sizeof v);
    memset(dist, 0x3f, sizeof dist);

    dist[1] = 0;

    q.push(make_pair(0, 1));

    while (!q.empty())
    {
        int x = q.top().second;
        q.pop();
        if (v[x])
        {
            continue;
        }
        v[x] = true;

        for (rint i = h[x]; i; i = ne[i])
        {
            int y = e[i];
            int z = w[i] > x;
            if (dist[y] > dist[x] + z)
            {
                dist[y] = dist[x] + z;
                q.push(make_pair(-dist[y], y));
            }
        }
    }

    return dist[n] <= k;
}

signed main()
{
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    memset(h, -1, sizeof h);

    cin >> n >> m >> k;
    for (rint i = 1; i <= m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
        add(b, a, c);
    }

    int l = 0, r = 1e6 + 1;

    while (l < r)
    {
        int mid = l + r >> 1;
        if (dijkstra(mid) == true)
            l = mid;
        else
            l = mid + 1;
    }

    if (r == 1e6 + 1)
    {
        cout << -1;
        return 0;
    }

    cout << r << endl;

    return 0;
}
2022/8/4 08:32
加载中...