Submission #976549

#TimeUsernameProblemLanguageResultExecution timeMemory
976549HaanhtienRelay Marathon (NOI20_relaymarathon)C++14
17 / 100
242 ms49104 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long const ll N=1e5+10; const ll M=4e5+10; ll n,m,k; ll d[N],flag[N],h[N]; ll mark[N],a[N]; struct edge { long long u,v,w; }; edge c[M]; vector<pair<ll,ll>> g[N]; void Dis(){ priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>> pq; for(long long i=1;i<=n;i++) if(d[i]==0) pq.push({0,i}); while(!pq.empty()){ ll val=pq.top().fi,u=pq.top().se; pq.pop(); if(d[u]!=val) continue; for(auto e:g[u]){ long long w=e.se,v=e.fi; if(d[v]==d[u]+w) flag[v]=1; if(d[v]>d[u]+w) { h[v]=h[u],d[v]=d[u]+w,flag[v]=0; pq.push({d[v],v}); } } } } int main () { //freopen("cities.inp","r",stdin); //freopen("cities.out","w",stdout); ios_base::sync_with_stdio(false); cin.tie(nullptr); cin>>n>>m>>k; fill(d+1,d+n+1,1e18); for(ll i=1;i<=m;i++) { ll u,v,w; cin>>u>>v>>w; c[i].u=u; c[i].v=v; c[i].w=w; g[u].push_back({v,w}); g[v].push_back({u,w}); } for(long long i=1;i<=k;i++) { long long x; cin>>x; d[x]=flag[x]=0; h[x]=x; } Dis(); long long a_main=0,b_main=0,t=1e18; for(long long i=1;i<=m;i++) { long long u=c[i].u,v=c[i].v,w=c[i].w; if(d[u]<1e18 && d[v]<1e18) { if(flag[u]==1 || flag[v]==1 || h[u]!=h[v]) { long long t_try=d[u]+d[v]+w; if(t_try<t) { a_main=h[u]; b_main=h[v]; t=t_try; } } } } //cout<<t<<'\n'; long long t2=1e18,abest1=1e18,abest2=1e18,bbest1=1e18,bbest2=1e18,a1=1e18,b1=1e18; for(long long i=1;i<=m;i++) { long long u=c[i].u,v=c[i].v,w=c[i].w; if(d[u]<1e18 && d[v]<1e18) { if(flag[u]==1 || flag[v]==1 || h[u]!=h[v]) { long long t_try=d[u]+d[v]+w; //cout<<u<<" "<<v<<" "<<h[u]<<" w "<<h[v]<<'\n'; if(h[u]!=a_main && h[v]!=a_main && h[u]!=b_main && h[v]!=b_main && t_try<t2) { t2=t_try; continue; } if((h[u]==a_main && h[v]!=b_main) || (h[v]==a_main && h[u]!=b_main)) { if(t_try<abest1) { abest2=abest1; abest1=t_try; a1=(h[u]==a_main ? h[v]:h[u]); } else if(t_try<abest2) abest2=t_try; } if((h[u]!=a_main && h[v]==b_main) || (h[v]!=a_main && h[u]==b_main)) { if(t_try<bbest1) { bbest2=bbest1; bbest1=t_try; b1=(h[u]==b_main ? h[v]:h[u]); } else if(t_try<bbest2) bbest2=t_try; } } } } long long dmin=t+t2; //cout<<t2<<'\n'; if(a1==b1) dmin=min({dmin,abest1+bbest2,abest2+bbest1}); else dmin=min(dmin,abest1+bbest1); cout<<dmin; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...