将整个dijkstra的操作加上一维k就行了
注意dis赋极大值的时候要从0-k都赋上!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+5;
const int maxm=5e4+5;
const ll inf=1e17;
int n,m,k,cnt,head[maxn],vis[maxn][22];
struct edge
{
int to,nxt,v;
}e[maxm<<1];
struct point
{
int no,used;
ll val;
bool operator <(const point &oth) const
{
return val>oth.val;
}
};
ll dis[maxn][22];
void add(int x,int y,int z)
{
e[++cnt].to=y;
e[cnt].nxt=head[x];
e[cnt].v=z;
head[x]=cnt;
}
void dijkstra()
{
for(int t=0;t<=k;t++)
for(int i=1;i<=n;i++) dis[i][t]=inf;
dis[1][0]=0;
priority_queue <point> q;
q.push((point){1,0,0});
while(!q.empty())
{
point fir=q.top();
q.pop();
if(vis[fir.no][fir.used]) continue;
vis[fir.no][fir.used]=1;
for(int i=head[fir.no];i;i=e[i].nxt)
{
int to=e[i].to;
if(dis[to][fir.used]>dis[fir.no][fir.used]+e[i].v)
{
dis[to][fir.used]=dis[fir.no][fir.used]+e[i].v;
q.push((point){to,fir.used,dis[to][fir.used]});
}
if(fir.used<k && dis[to][fir.used+1]>dis[fir.no][fir.used])
{
dis[to][fir.used+1]=dis[fir.no][fir.used];
q.push((point){to,fir.used+1,dis[to][fir.used+1]});
}
}
}
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
dijkstra();
printf("%lld",dis[n][k]);
return 0;
}