Submission #1232476

#TimeUsernameProblemLanguageResultExecution timeMemory
1232476hoa208Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
237 ms29356 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define FORD(i,b,a) for(int i=(b);i>=(a);i--) #define pa pair<ll,ll> #define fi first #define se second #define bit(mask,j) (mask&(1<<j)) #define hoabanmatuy ios_base::sync_with_stdio(false);cin.tie(0); const ll INF=1e15; const ll N=1e5+10; const ll M=2e5+10; ll n,m,ans=INF; ll S,T,U,V; vector<pa> g[N]; ll d_st[N],mark_st[N]; void dextra(ll s,ll t) { memset(d_st,0x3f,sizeof d_st); memset(mark_st,0,sizeof mark_st); priority_queue<pa,vector<pa>,greater<pa>> q; q.push({0,s}); d_st[s]=0; mark_st[s]=0; while(!q.empty()) { ll u=q.top().se; q.pop(); if(mark_st[u]) continue; mark_st[u]=1; for(auto e:g[u]) { ll v=e.fi,w=e.se; if(d_st[v]>d_st[u]+w) { d_st[v]=d_st[u]+w; q.push({d_st[v],v}); } } } memset(mark_st,0,sizeof mark_st); queue<ll> trace; trace.push(t); mark_st[t]=1; while(!trace.empty()) { ll u=trace.front(); trace.pop(); for(auto e:g[u]) { ll v=e.fi,w=e.se; if(mark_st[v]==0 && d_st[v]+w==d_st[u]) { mark_st[v]=1; trace.push(v); } } } /* FOR(i,1,n) if(mark_st[i]==1) cout<<i<<' '; cout<<'\n'; */ } ll mark_uv[N][3],d_uv[N][3]; void slove() { memset(d_uv,0x3f,sizeof d_uv); memset(mark_uv,0,sizeof mark_uv); priority_queue<pair<ll,pa>,vector<pair<ll,pa>>,greater<pair<ll,pa>>> q; q.push({0,{U,0}}); d_uv[U][0]=0; while(!q.empty()) { ll u=q.top().se.fi,t=q.top().se.se; q.pop(); if(u==V) { ans=min(d_uv[u][t],ans); return; } if(mark_uv[u][t]) continue; mark_uv[u][t]=1; for(auto e:g[u]) { ll v=e.fi,w=e.se; if(t!=2 && d_st[v]==d_st[u]+w && mark_st[v]==1) { ll t2=t|1; if(d_uv[v][t2]>d_uv[u][t]) { d_uv[v][t2]=d_uv[u][t]; q.push({d_uv[v][t2],{v,t2}}); } } ll t1=t;if(t==1) t1=2; if(d_uv[v][t1]>d_uv[u][t]+w) { d_uv[v][t1]=d_uv[u][t]+w; q.push({d_uv[v][t1],{v,t1}}); } } } } int main () { hoabanmatuy if(fopen("hbmt.inp", "r")) { freopen("hbmt.inp", "r", stdin); freopen("hbmt.out", "w", stdout); } cin>>n>>m; cin>>S>>T; cin>>U>>V; FOR(i,1,m) { ll u,v,w; cin>>u>>v>>w; g[u].push_back({v,w}); g[v].push_back({u,w}); } FOR(i,0,1) { dextra(S,T); slove(); swap(S,T); } cout<<ans; return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:110:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |             freopen("hbmt.inp", "r", stdin);
      |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:111:20: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |             freopen("hbmt.out", "w", stdout);
      |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...