这题我用没关流的cin读边和scanf时间居然差不多!?(都能ac) 是数据太水了吗?……
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+11, M = 1e5+11;
int n, m, k, v[N][11], d[N][11], s, t;
int head[N], ver[M], nex[M], edge[M], tot;
void add(int x, int y, int z){
nex[++tot] = head[x];
head[x] = tot;
edge[tot] = z;
ver[tot] = y;
}
void dija(){ // 花费,点编号,使用的免费次数
priority_queue<pair<int, pair<int, int>>> q;
q.push(make_pair(0, make_pair(s, 0)));
d[s][0] = 0;
while(q.size()){
int w = -q.top().first;
int x = q.top().second.first;
int kt = q.top().second.second;
q.pop(); if(v[x][kt]) continue; v[x][kt] = 1;
for(int i=head[x]; i; i=nex[i]){
int y = ver[i], e = edge[i];
if(d[y][kt] > w + e){
d[y][kt] = w + e;
q.push(make_pair(-d[y][kt], make_pair(y, kt)));
} if(kt == k) continue;
if(d[y][kt+1] > w){
d[y][kt+1] = w;
q.push(make_pair(-d[y][kt+1], make_pair(y, kt + 1)));
}
}
}
}
int main(){
cin>>n>>m>>k>>s>>t;
for(int i=0;i<=n;i++)
for(int j=0;j<=k;j++)
d[i][j] = 0x3f3f3f3f;
int x, y, z;
for(int i=0;i<m;i++){
cin>>x>>y>>z;
add(x, y, z); add(y, x, z);
}
dija();
int ans = 0x3f3f3f3f;
for(int i=0;i<=k;i++) ans = min(ans, d[t][i]);
cout<<ans<<endl;
return 0;
}