题目链接:https://nanti.jisuanke.com/t/31001
分析:分层图最短路 https://www.cnblogs.com/ywjblog/p/9270423.html
代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
using namespace std;
typedef pair<int,int> pii;
const int N =100000 + 7 , M = 200000 + 7, inf = 0x3f3f3f3f ;
int n,m,k,nEdge;
int nxt[M],to[M],head[M],vis[N][15];
ll val[M],d[N][15];
struct Edge{
int u,v;
ll w;
bool operator < (const Edge& rhs)const{
return w < rhs.w;
}
}edges[M];
struct Node{
int u;
ll d;
int k;
bool operator < (const Node& rhs)const{
return d > rhs.d;
}
};
void AddEdge(int u,int v,ll c){
val[nEdge] = c,to[nEdge] = v , nxt[nEdge] = head[u] , head[u] = nEdge++;
}
void Dijstra(){
d[1][0] = 0;
priority_queue<Node>q;
q.push({1,0,0});
while(!q.empty()){
Node now = q.top();q.pop();
int u = now.u ,kk = now.k ;
if(vis[u][kk]) continue;
vis[u][kk] = 1;
for(int e=head[u];~e;e=nxt[e]){
int v = to[e];
if(d[u][kk] + val[e] < d[v][kk]){
d[v][kk] = d[u][kk] + val[e];
if(!vis[v][kk])q.push({v,d[v][kk],kk});
}
if(kk+1<=k&&d[u][kk] < d[v][kk+1]){
d[v][kk+1] = d[u][kk];
if(!vis[v][kk+1])q.push({v,d[v][kk+1],kk+1});
}
}
}
}
int main(){
//FRER();
int T;
scanf("%d",&T);
while(T--){
nEdge = 0;
mem(d,inf);
mem(vis,0);
mem(head,-1);
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
scanf("%d%d%lld",&edges[i].u,&edges[i].v,&edges[i].w);
sort(edges,edges+m);
AddEdge(edges[0].u,edges[0].v,edges[0].w);
for(int i=1;i<m;i++){
if(edges[i].u!=edges[i-1].u&&edges[i].v!=edges[i-1].v)
AddEdge(edges[i].u,edges[i].v,edges[i].w);
}
Dijstra();
ll ans = inf;
for(int i=0;i<=k;i++)
ans = min(ans,d[n][i]);
printf("%lld\n",ans);
}
}