题目大意:有N个城市,M条有向边,城市之间可能有多条边,你可以选择让至多K条边的长度变为0,问最好的情况下,城市1到城市N的最短路径为多少
思路:分层图最短路裸题
#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
#define MP make_pair
using namespace std;
const int N = 401000*11;//原先是4e6+10,改成这个过了而且是800ms,原先一直tle,谁能告诉我是为什么!!!!!!!!!!!!!!!这让我改了半小时的bug!!!
ll n, m, k, h[N], vis[N], dis[N], cnt, t;
struct node {
ll v, w, net;
} no[N];
void add(ll u, ll v, ll w) {
no[cnt].v = v;
no[cnt].w = w;
no[cnt].net = h[u];
h[u] = cnt++;
}
priority_queue<pii, vector<pii>, greater<pii> > q;
void dij() {
dis[1] = 0;
q.push(MP(0, 1));
while(!q.empty()) {
ll u = q.top().second;
q.pop();
if(vis[u])
continue;
vis[u] = 1;
for(ll i = h[u]; ~i; i = no[i].net) {
ll v = no[i].v, w = no[i].w;
if(!vis[v] && dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(MP(dis[v], v));
}
}
}
}
int main() {
scanf("%lld", &t);
while(t--) {
memset(h, -1, sizeof h);
memset(dis, 0x3f3f3f3f, sizeof dis);
memset(vis, 0, sizeof vis);
cnt = 0;
scanf("%lld%lld%lld", &n, &m, &k);
for(ll u, v, w, i = 0; i < m; i++) {
scanf("%lld%lld%lld", &u, &v, &w);
for(ll j = 0; j <= k; j++) {
add(j * n + u, j * n + v, w);
add((j - 1)*n + u, j * n + v, 0);
}
}
dij();
ll ans = 0x3f3f3f3f3f3f3f3f;
for(ll i = 0; i <= k; i++)
ans = min(ans, dis[n * i + n]);
printf("%lld\n", ans);
}
return 0;
}