1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<cstdio> #include<cstring> #include<algorithm> #define cl(x,y) memset(x,y,sizeof(x)) using namespace std;
const int maxn=55,maxe=2005,maxs=2505; int n,e,K; int tot,son[maxe],nxt[maxe],lnk[maxn],w[maxe]; inline void add(int x,int y,int z){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;w[tot]=z; } int que[maxs],quek[maxs],dst[maxn][maxn]; bool vis[maxn][maxn]; void spfa(){ cl(dst,63); int hed=0,til=1; que[1]=1,quek[1]=0,dst[1][0]=0;vis[1][0]=1; while (hed!=til){ hed=(hed+1)%maxs; int x=que[hed],k=quek[hed]; vis[x][k]=0; for (int j=lnk[x];j;j=nxt[j]){ if (dst[son[j]][k]>dst[x][k]+w[j]){ dst[son[j]][k]=dst[x][k]+w[j]; if (!vis[son[j]][k]) vis[son[j]][k]=1,til=(til+1)%maxs, que[til]=son[j],quek[til]=k; } if (k<=K&&dst[son[j]][k+1]>dst[x][k]+w[j]/2){ dst[son[j]][k+1]=dst[x][k]+w[j]/2; if (!vis[son[j]][k+1]) vis[son[j]][k+1]=1,til=(til+1)%maxs, que[til]=son[j],quek[til]=k+1; } } } } int main(){ scanf("%d%d%d",&n,&e,&K); for (int i=1,x,y,z;i<=e;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z); spfa(); int ans=0x3f3f3f3f; for (int i=0;i<=K;i++) ans=min(ans,dst[n][i]); printf("%d",ans); return 0; }
|