Submission #701655

#TimeUsernameProblemLanguageResultExecution timeMemory
701655karriganRelay Marathon (NOI20_relaymarathon)C++17
17 / 100
6066 ms207320 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+9; const long long inf=1e13; struct edg{ int v; long long w; }; vector<edg>a[maxn]; vector<int>bit[2]; int b[maxn]; struct suzy{ int u; long long w; int lena; bool operator < (const suzy &p)const { return w>p.w; } }; int n,m,k; long long dis[maxn]; int vis[maxn]; pair<long long,int>d[maxn][21]; int x=0,y=0,fix=0,fiy=0; long long another=inf; void sp(int bt){ if (bit[0].empty()||bit[1].empty())return; for (int i=1;i<=n;i++){ dis[i]=inf; vis[i]=0; } priority_queue<suzy>c; for (auto v:bit[0]){ c.push({v,0,v}); dis[v]=0; } while (!c.empty()){ auto u=c.top(); c.pop(); if (vis[u.u]==1)continue; vis[u.u]=1; if (u.w!=0)d[u.u][bt]={u.w,u.lena}; //cerr<<u.lena<<'\n'; for (auto v:a[u.u]){ long long newdis=u.w+v.w; if (newdis<dis[v.v]){ dis[v.v]=newdis; c.push({v.v,newdis,u.lena}); } } } } struct yoonjung{ int u; long long w; bool operator < (const yoonjung &p)const { return w>p.w; } }; long long p[maxn][2]; int vi[maxn]; long long prefix[maxn]; long long suffix[maxn]; void anothersp(int u1,int t){ for (int i=1;i<=n;i++){ p[i][t]=inf; vi[i]=0; } p[u1][t]=0; priority_queue<yoonjung>c; c.push({u1,0}); while (!c.empty()){ auto u=c.top(); c.pop(); if (vi[u.u])continue; vi[u.u]=1; for (auto v:a[u.u]){ long long newdis=u.w+v.w; if (p[v.v][t]>newdis){ p[v.v][t]=newdis; c.push({v.v,newdis}); } } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); //freopen("GH.INP","r",stdin); //freopen("GH.OUT","w",stdout); cin>>n>>m>>k; for (int i=1;i<=m;i++){ int u,v; long long w; cin>>u>>v>>w; a[u].push_back({v,w}); a[v].push_back({u,w}); } for (int i=1;i<=k;i++)cin>>b[i]; long long ans=inf; for (int j=20;j>=0;j--){ bit[0].clear(); bit[1].clear(); for (int i=1;i<=k;i++){ bit[(i>>j&1)].push_back(b[i]); } //cout<<bit[0].size()<<" "<<bit[1].size()<<'\n'; sp(j); for (auto v:bit[1]){ if (d[v][j].first<ans&&d[v][j].second!=0){ ans=d[v][j].first; x=d[v][j].second,y=v; } } swap(bit[0],bit[1]); sp(j); for (auto v:bit[1]){ if (d[v][j].first<ans&&d[v][j].second!=0){ ans=d[v][j].first; x=d[v][j].second,y=v; } } } fix=x,fiy=y; for (int i=1;i<=n;i++){ for (int j=20;j>=0;j--){ d[i][j]={0,0}; } } for (int j=20;j>=0;j--){ bit[0].clear(); bit[1].clear(); for (int i=1;i<=k;i++){ if (b[i]!=fix&&b[i]!=fiy)bit[(i>>j&1)].push_back(b[i]); } sp(j); for (auto v:bit[1]){ if (d[v][j].first<another&&d[v][j].second!=0){ another=min(another,d[v][j].first); } } swap(bit[0],bit[1]); sp(j); for (auto v:bit[1]){ if (d[v][j].first<another&&d[v][j].second!=0){ another=min(another,d[v][j].first); } } } long long dd=ans+another; anothersp(x,0); anothersp(y,1); prefix[0]=inf; p[x][0]=p[x][1]=p[y][0]=p[y][1]=inf; for (int i=1;i<=k;i++){ prefix[i]=min(prefix[i-1],p[b[i]][1]); } suffix[k+1]=inf; for (int i=k;i>=1;i--){ suffix[i]=min(suffix[i+1],p[b[i]][1]); } for (int i=1;i<=k;i++){ long long value=p[b[i]][0]+min(prefix[i-1],suffix[i+1]); dd=min(dd,value); } cout<<dd; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...