分层图+Dijkstra
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 typedef long long ll; 5 6 const int MAXN=100100; 7 const int MAXM=500100; 8 const int INF=0x3f3f3f3f; 9 10 struct Edge 11 { 12 int to,next; 13 int w; 14 }e[MAXM*80]; 15 int head[MAXM*80],cnt=0; 16 void addEdge(int x,int y,int z) 17 { 18 cnt++; 19 e[cnt].to=y; 20 e[cnt].next=head[x]; 21 e[cnt].w=z; 22 head[x]=cnt; 23 return; 24 } 25 26 int n,m,k; 27 ll t[MAXN*80]; 28 bool vis[MAXN*80]; 29 30 void Dijkstra() 31 { 32 for (int i=1;i<=(k+1)*n;i++) 33 { 34 t[i]=INF; 35 vis[i]=false; 36 } 37 t[1]=0; 38 39 priority_queue< pair<int,int> >pq; 40 pq.push(make_pair(0,1)); 41 42 while (!pq.empty()) 43 { 44 int cur=pq.top().second; 45 pq.pop(); 46 47 if (vis[cur]) continue; 48 vis[cur]=true; 49 50 for (int i=head[cur];i!=0;i=e[i].next) 51 { 52 if (t[e[i].to]>t[cur]+e[i].w) 53 { 54 t[e[i].to]=t[cur]+e[i].w; 55 pq.push(make_pair(-t[e[i].to],e[i].to)); 56 } 57 } 58 } 59 return; 60 } 61 62 int main() 63 { 64 cin>>n>>m>>k; 65 66 int u,v,w; 67 for (int i=1;i<=m;i++) 68 { 69 cin>>u>>v>>w; 70 for (int i=0;i<=k;i++) 71 { 72 addEdge(u+i*n,v+i*n,w); 73 addEdge(v+i*n,u+i*n,w); 74 } 75 for (int i=0;i<k;i++) 76 { 77 addEdge(u+i*n,v+(i+1)*n,0); 78 addEdge(v+i*n,u+(i+1)*n,0); 79 } 80 } 81 82 Dijkstra(); 83 84 ll ans=INF; 85 for (int i=1;i<=(k+1);i++) 86 { 87 ans=min(ans,t[i*n]); 88 } 89 cout<<ans<<endl; 90 91 return 0; 92 }