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 73 74 75 76
| #include <bits/stdc++.h> #define SZ(x) (int)(x).size() #define ALL(x) (x).begin(),(x).end() #define PB push_back #define EB emplace_back #define MP make_pair #define FI first #define SE second using namespace std; typedef double DB; typedef long double LD; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII; typedef vector<int> VI; typedef vector<PII> VPII;
const LL INF=0x3f3f3f3f3f3f3f3f; const int N=505; int n,m,t; LL o,d[N][N],dist[N]; VI g[N]; VI a; bool st[N]; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } void dijkstra() { priority_queue<pair<LL,int>,vector<pair<LL,int>>,greater<pair<LL,int>>> q; for(int i=1;i<=n;i++) dist[i]=INF; q.emplace(0,1); dist[1]=0; while(SZ(q)) { int u=q.top().SE; q.pop(); if(st[u]) continue; st[u]=true; for(auto v:g[u]) { LL w=d[u][v]; if(!st[v]&&dist[v]>dist[u]+w) { dist[v]=dist[u]+w; q.emplace(dist[v],v); } } } if(dist[n]==INF) cout<<"stuck"<<'\n'; else cout<<dist[n]<<'\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>n>>m>>t>>o; for(int i=1;i<=t;i++) { int x; cin>>x; a.PB(x); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=INF; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; d[u][v]=d[v][u]=w; } floyd(); a.PB(1),a.PB(n); for(int i=0;i<SZ(a);i++) for(int j=i+1;j<SZ(a);j++) { if(d[a[i]][a[j]]>o) continue; g[a[i]].PB(a[j]),g[a[j]].PB(a[i]); } dijkstra(); return 0; }
|