#include<bits/stdc++.h> #define MAXN 200005 using namespace std; int n,m,k,tot,beg,end; int h[MAXN*15],dis[MAXN*15]; bool vis[MAXN*15]; struct node{ int from,to,next,cost; }e[MAXN*15]; void init(){ tot=0; memset(vis,false,sizeof(vis)); memset(dis,0x7f,sizeof(dis)); memset(h,-1,sizeof(h)); } int zhuan(int x,int y){//x号节点第y层 return x+(n+1)*y; } void add(int x,int y,int z){ tot++; e[tot].from=x; e[tot].to=y; e[tot].cost=z; e[tot].next=h[x]; h[x]=tot; } struct node2{ int id,num; bool operator<(const node2&a)const{ return num>a.num; } }; int dijkstar(){ priority_queue<node2>q; q.push((node2){zhuan(beg,0),0}); dis[zhuan(beg,0)]=0; while(!q.empty()){ node2 u=q.top();q.pop(); if(vis[u.id]==true)continue; vis[u.id]=true; for(int i=h[u.id];i!=(-1);i=e[i].next){ if(dis[e[i].to]>u.num+e[i].cost){ dis[e[i].to]=u.num+e[i].cost; q.push((node2){e[i].to,dis[e[i].to]}); } } } return dis[zhuan(end,k)]; } int main(){ while(scanf("%d%d%d",&n,&m,&k)==3){ init(); cin>>beg>>end; for(int i=1;i<=m;i++){ int x,y,z;cin>>x>>y>>z; for(int j=0;j<=k;j++){ add(zhuan(x,j),zhuan(y,j),z); add(zhuan(y,j),zhuan(x,j),z); } for(int j=0;j<k;j++){ add(zhuan(x,j),zhuan(y,j+1),0); add(zhuan(y,j),zhuan(x,j+1),0); } } cout<<dijkstar()<<endl; } }
模板题