19 pts,求调
查看原帖
19 pts,求调
1120498
NewbieZZZ楼主2025/2/8 00:47

dp 思想求分层图最短路,只 AC #5,#11。

WA 记录(别管那个 CE)

其中一版代码如下:

#include <bits/extc++.h>
using namespace std;
using ll = long long;
#define pii pair<int, int>
#define mkp make_pair

int n, m, k, s, t;
int dis[10010][11]; // the smallest cost to reach i, and use the chance for j times
vector<pii> e[10010];
bool vis[10010][11];

bool operator< (const pair<int, pii> a, const pair<int, pii> b){
    return a.second.second > b.second.second; // 边权
}

void dijkstra(){
    memset(dis, 0x5f, sizeof dis);
    priority_queue<pair<int, pii>> q;
    dis[s][0] = 0;
    q.push(mkp(0, mkp(s, 0))); // cnt, id, val;
    while(q.size()){
        int cnt = q.top().first;
        int id = q.top().second.first;
        q.pop();
        if(vis[id][cnt]){
            continue;
        }
        vis[id][cnt] = 1;
        for(auto i : e[id]){
            if(!vis[i.first][cnt+1] && cnt < k && (dis[i.first][cnt+1] > dis[id][cnt])){
                dis[i.first][cnt+1] = dis[id][cnt]; // use the chance
                q.push(mkp(cnt+1, mkp(i.first, dis[i.first][cnt+1])));
            }
            if(!vis[i.first][cnt] && dis[i.first][cnt] > dis[id][cnt] + i.second){
                dis[i.first][cnt] = dis[id][cnt] + i.second;
                q.push(mkp(cnt, mkp(i.first, dis[i.first][cnt])));
            }
        }
    }
}

int main(){
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> m >> k; cin >> s >> t;
    ++ s, ++ t;
    for(int i=1, u, v, w; i<=m; ++i){
        cin >> u >> v >> w;
        ++ u, ++ v;
        e[u].emplace_back(v, w);
        e[v].emplace_back(u, w);
    }
    dijkstra();
    int ans = INT_MAX;
    for(int K=0; K<=k; ++K){
        ans = min(ans, dis[t][K]);
    }
    cout << ans;
    return 0;
}

谢谢大佬看完。而且,本帖玄关喵!

2025/2/8 00:47
加载中...