求助!D用分层图TLE了(在牢哥帮助下终于过了

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
#define PIII pair<int,PII>
const int N = 1e18;

void slu() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> rest(n + 1);
    vector<list<int>> M(n + 1);
    priority_queue<PIII, vector<PIII >, greater<>> q;
    vector<vector<int>> dis(k + 1, vector<int>(n + 1, N));
    vector<vector<int>> vis(k + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= n; i++)cin >> rest[i];
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        M[u].push_back(v);
        M[v].push_back(u);
    }
    if (k != 0)q.push({1, {1, 1}});
    q.push({rest[1], {0, 1}});
    //q--->{花费,{层数,目的地}}
    while (!q.empty()) {
        auto it = q.top();
        q.pop();
        int loc = it.second.second;
        int stage = it.second.first;
        int cost = it.first;
        if (vis[stage][loc])continue;
        vis[stage][loc] = 1;
        for (auto i = M[loc].begin(); i != M[loc].end(); i++) {
            int aim = *i;
            int add = rest[aim];
            if (dis[0][aim] > cost + add) {//休息
                dis[0][aim] = cost + add;
                q.push({dis[0][aim], {0, aim}});
            }
            if (stage < k && dis[stage + 1][aim] > cost + 1) {//不休息
                dis[stage + 1][aim] = cost + 1;
                q.push({dis[stage + 1][aim], {stage + 1, aim}});
            }
        }
    }
    int res = N;
    for (int i = 0; i <= k; i++) {
        res = min(res, dis[i][n]);
    }
    cout << res << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--)slu();

}

全部评论
INT_MAX应该开1e18吧
1 回复 分享
发布于 2024-10-12 14:46 湖南

相关推荐

认真搞学习:这个真喷不了,你是我见过最美的牛客女孩
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务