#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1e5+7; int n,m,k; bool vis[MAXN]; long long dist[MAXN][11]; struct qnode{ int v; int c; qnode(){} qnode(int _v, int _c):v(_v),c(_c){} bool operator <(const qnode &a)const{ return c > a.c; } }; vector<qnode> g[MAXN]; void Dijstra(){ for(int i=1; i<=n; ++i){ for(int j=0; j<=k; ++j){ if(i==1) dist[i][j] = 0; else dist[i][j] = INF; } } priority_queue<qnode> pq[11]; for(int i=0; i<=k; ++i){ memset(vis, false, sizeof(vis)); pq[i].push(qnode(1, 0)); qnode tmp; while(!pq[i].empty()){ tmp = pq[i].top(); pq[i].pop(); int u = tmp.v; if(vis[u]) continue; vis[u] = true; for(int j=0; j<g[u].size(); ++j){ int v = g[u][j].v; int cost = g[u][j].c; if(i==0){ if(!vis[v]&&dist[v][i]>dist[u][i]+cost){ dist[v][i] = dist[u][i] + cost; pq[i].push(qnode(v,dist[v][i])); } }else{ if(!vis[v]){ //d[v][i] 从1到v恰好去掉i条边 //去掉uv边或松弛操作 long long tmp=min(dist[u][i-1],dist[u][i]+cost); if(dist[v][i]>tmp) { dist[v][i] = min(dist[v][i], tmp); pq[i].push(qnode(v,dist[v][i])); } } } } } } } int main(int argc, char const *argv[]) { int t; freopen("in.txt","r",stdin); scanf("%d",&t); while(t--){ for(int i=0; i<MAXN; ++i) g[i].clear(); scanf("%d%d%d",&n,&m,&k); for(int i=0; i<m; ++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); g[u].push_back(qnode(v,w)); } Dijstra(); cout<<dist[n][k]<<endl; } return 0; }
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1e5+7; #define LL long long struct nod{ int v;LL c; nod(int v=0,LL c=0):v(v),c(c){} bool operator <(const nod&a)const{ return c>a.c; } }; struct edge{ int v,c; edge(int v=0,int c=0):v(v),c(c){} }; vector<edge> e[maxn*11]; void addedge(int a,int b,int c) { e[a].push_back(edge(b,c)); // printf("add %d %d %d\n",a,b,c); } LL d[maxn*12]; bool vis[maxn*12]; int n,m,k; LL dij() { for(int i=0,sz=n*(k+1)+k;i<=sz;i++) { vis[i]=false; d[i]=INF; } priority_queue<nod>q; for(int i=0;i<=k;i++) { d[k+1+i]=0; } q.push(nod(k+1,0)); nod t; while(!q.empty()) { t=q.top();q.pop(); int u=t.v; if(vis[u]) continue; vis[u]=true; for(int i=0,sz=e[u].size();i<sz;i++) { int v=e[u][i].v,c=e[u][i].c; if(!vis[v]&&d[v]>d[u]+c){ d[v]=d[u]+c; q.push(nod(v,d[v])); } } } LL ans=1e18; for(int i=0;i<=k;i++) ans=min(ans,d[n*(k+1)+i]); return ans; } int main() { // freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); // printf("%d %d %d\n",a,b,c); a*=k+1;b*=k+1; for(int i=0;i<=k;i++) { addedge(a+i,b+i,c); //a0 b0 c //a0 b1 0 //... //ak-1 bk-1 c //ak-1 bk 0 addedge(a+i,b+i+1,0); } e[a+k].pop_back(); } printf("%lld\n",dij()); for(int i=1;i<=n;i++) for(int j=0;j<=k;j++) e[i*(k+1)+j].clear(); } return 0; }