T了第三个点
#include<bits/stdc++.h>
using namespace std;
const int N=150010;
int n,m,k;
int h[20510],b[N],nx[N],v[N],tt,dis[20510],ans=0x3f3f3f3f;
bool pd[N];
void zj(int x,int y,int z)
{
b[++tt]=y;
v[tt]=z;
nx[tt]=h[x];
h[x]=tt;
}
void dji()
{
priority_queue<pair<int,int> > q;
memset(dis,0x3f3f3f3f,sizeof(dis));
q.push({0,1});
dis[1]=0;
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(pd[x])
continue;
pd[x]=true;
for(int i=h[x];i;i=nx[i])
{
int y=b[i],z=v[i];
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
q.push({-dis[y],y});
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int j=0;j<=k;j++)
zj(x+j*n,y+j*n,z),zj(y+j*n,x+j*n,z);
for(int j=0;j<k;j++)
zj(x+j*n,y+(j+1)*n,z/2),zj(y+j*n,x+(j+1)*n,z/2);
}
dji();
for(int i=1;i<=k+1;i++)
ans=min(ans,dis[i*n]);
printf("%d",ans);
return 0;
}