蒟蒻用的是dp做法: 91分版本(k在内层)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, k, s, t, s1, s2, s3, dis[105][10005], tt, in = 0x7fffffff;
bool vis[10005];
struct Y {
int v, w;
};
struct node {
int dis, u;
bool operator>(const node& a) const {
return dis > a.dis;
}
};
vector<Y> v[10005];
priority_queue<node, vector<node>, greater<node> > q;
void Dijkstra() {
for(int i = 0; i < n; i++) {
for(int j = 0;j <= k;j++){
dis[j][i] = inf;
}
}
dis[0][s] = 0;
q.push({0, s});
while(!q.empty()) {
tt = q.top().u;
q.pop();
if(!vis[tt]) {
vis[tt] = true;
for(auto i : v[tt]) {
for(int j = 0; j <= k; j++) {
//-----------------------------
if(dis[j][i.v] > dis[j][tt] + i.w) {
dis[j][i.v] = dis[j][tt] + i.w;
q.push({dis[j][i.v], i.v});
}
//-----------------------------
if(j != 0 && dis[j][i.v] > dis[j - 1][tt]) {
dis[j][i.v] = dis[j - 1][tt];
q.push({dis[j][i.v], i.v});
}
//-----------------------------
}
}
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
scanf("%d %d", &s, &t);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &s1, &s2, &s3);
v[s1].push_back({s2, s3});
v[s2].push_back({s1, s3});
}
Dijkstra();
for(int i = 0;i <= k;i++){
in = min(in, dis[i][t]);
}
printf("%d", in);
return 0;
}
36分做法(k在dijkstra外层):
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, k, s, t, s1, s2, s3, dis[105][10005], tt, in = 0x7fffffff, num1, num2, num3;
bool vis[10005];
struct Y {
int v, w;
};
struct node {
int dis, u;
bool operator>(const node& a) const {
return dis > a.dis;
}
};
vector<Y> v[10005];
priority_queue<node, vector<node>, greater<node> > q;
void dijkstra(int x) {
for(int i = 0; i < n; i++) {
dis[x][i] = inf;
}
dis[x][s] = 0;
q.push({0, s});
while(!q.empty()) {
tt = q.top().u;
q.pop();
if(!vis[tt]) {
vis[tt] = true;
for(auto i : v[tt]) {
///*
//-----------------------------
if(dis[x][i.v] > dis[x][tt] + i.w) {
dis[x][i.v] = dis[x][tt] + i.w;
q.push({dis[x][i.v], i.v});
}
//-----------------------------
if(x != 0 && dis[x][i.v] > dis[x - 1][tt]) {
dis[x][i.v] = dis[x - 1][tt];
q.push({dis[x][i.v], i.v});
}
//*/
//-----------------------------
/*
num1 = dis[x][i.v];
num2 = dis[x][tt] + i.w;
if(x != 0) {
num3 = dis[x - 1][tt];
if(num1 > num2 && num2 <= num3) {
dis[x][i.v] = dis[x][tt] + i.w;
q.push({dis[x][i.v], i.v});
} else if(num1 > num3 && num2 > num3) {
dis[x][i.v] = dis[x - 1][tt];
q.push({dis[x][i.v], i.v});
}
} else {
if(dis[x][i.v] > dis[x][tt] + i.w) {
dis[x][i.v] = dis[x][tt] + i.w;
q.push({dis[x][i.v], i.v});
}
}
//*/
}
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
scanf("%d %d", &s, &t);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &s1, &s2, &s3);
v[s1].push_back({s2, s3});
v[s2].push_back({s1, s3});
}
for(int i = 0; i <= k; i++) {
dijkstra(i);
}
for(int i = 0; i <= k; i++) {
in = min(in, dis[i][t]);
}
printf("%d", in);
return 0;
}