dp 思想求分层图最短路,只 AC #5,#11。
其中一版代码如下:
#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;
}
谢谢大佬看完。而且,本帖玄关喵!