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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include<bits/stdc++.h> using namespace std; const int MAXN=5010,inf=0x3f3f3f3f; struct edge { int v,w; }; vector <edge> g[MAXN]; struct node { int u,dis; bool operator <(const node a)const { return dis>a.dis; } }; int dis[MAXN],ldis[MAXN],deg[MAXN],n,m,k; bool vis[MAXN][MAXN]; priority_queue <node> q; void dijkstra() { memset(dis,inf,sizeof(dis)); memset(ldis,inf,sizeof(ldis)); dis[1]=0; q.push({1,0}); while(!q.empty()) { node front=q.top(); q.pop(); int u=front.u; if(front.dis>ldis[u]) continue; for(int i=0;i<g[u].size();i++) { int v=g[u][i].v,w=g[u][i].w; if(v!=1&&v!=n&°[v]<k)continue; if(front.dis+w<dis[v]) { ldis[v]=dis[v]; dis[v]=front.dis+w; q.push({v,dis[v]}); } else if(front.dis+w>dis[v]&&front.dis+w<ldis[v]) { ldis[v]=front.dis+w; q.push({v,ldis[v]}); } } } } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m>>k; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; g[u].push_back({v,w}); g[v].push_back({u,w}); if(!vis[u][v]) { vis[u][v]=vis[v][u]=1; deg[u]++,deg[v]++; } } dijkstra(); if(ldis[n]==inf)cout<<-1; else cout<<ldis[n]; return 0; }
|