#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#include<algorithm>
#include<map>
#define MS(x) memset(x,0,sizeof(x));
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=100005;
const int MAXM=200005;
struct qnode {
int v;
int t;
long long c;
qnode(int _v=0,int tt=0,long long _c=0):v(_v),t(tt),c(_c) {}
bool operator <(const qnode &r)const {
return c>r.c;
}
};
struct Edge {
int v;
long long cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost) {}
};
vector<Edge>E[MAXM<<1];
bool vis[MAXN][11];
long long dist[MAXN][11];
int n,m,c,k;
void Dijkstra(int n,int start) { //点的编号从1开始
memset(vis,false,sizeof(vis));
for(int i=1; i<=n; i++)
for(int j=0; j<=k; j++)
dist[i][j]=INF;
priority_queue<qnode>que;
while(!que.empty())que.pop();
dist[start][0]=0;
que.push(qnode(start,0,0));
qnode tmp;
while(!que.empty()) {
tmp=que.top();
que.pop();
int u=tmp.v;
int kk=tmp.t;
if(vis[u][kk])continue;
vis[u][kk]=true;
for(int i=0; i<E[u].size(); i++) {
int v=E[tmp.v][i].v;
int cost=E[u][i].cost;
if(!vis[v][kk]&&dist[v][kk]>dist[u][kk]+cost) {
dist[v][kk]=dist[u][kk]+cost;
que.push(qnode(v,kk,dist[v][kk]));
}
if(kk<k&&!vis[v][kk+1]&&dist[v][kk+1]>dist[u][kk]) {
dist[v][kk+1] = dist[u][kk];
que.push(qnode(v, kk+1, dist[v][kk+1]));
}
}
}
}
void addedge(int u,int v,int w) {
E[u].push_back(Edge(v,w));
}
int a,b;
map<string,int> addr;
int main() {
int T;
cin>>T;
while(T--) {
cin>>n>>m>>k;
{
for(int i=1;i<=n;i++)
E[i].clear();
int flag=1;
for(int i=1; i<=m; i++) {
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
Dijkstra(n,1);
int ans=INF;
for(int i=0; i<=k; i++) {
if(dist[n][i]<ans)
ans=dist[n][i];
}
printf("%d\n",ans);
}
}
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交