제출 #470044

#제출 시각아이디문제언어결과실행 시간메모리
470044Newtech66꿈 (IOI13_dreaming)C++17
100 / 100
121 ms21676 KiB
#include "dreaming.h" #include<bits/stdc++.h> using namespace std; using lol=long long int; void dfs(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,vector<int>& D,vector<int>& sD,vector<int>& marked) { vis[u]=1; for(auto [v,w]:g[u]) { if(vis[v]==1) continue; dfs(v,g,vis,D,sD,marked); if(D[v]+w>=D[u]) { sD[u]=D[u]; D[u]=D[v]+w; marked[u]=v; }else if(D[v]+w>=sD[u]) { sD[u]=D[v]+w; } } } void dfs2(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,vector<int>& D,vector<int>& sD,vector<int>& marked,vector<int>& pD,int weight=0,int p=-1) { vis[u]=2; if(p!=-1) { if(marked[p]==u) { pD[u]=weight+max(pD[p],sD[p]); }else { pD[u]=weight+max(pD[p],D[p]); } } for(auto [v,w]:g[u]) { if(vis[v]==2) continue; dfs2(v,g,vis,D,sD,marked,pD,w,u); } } int getrep(int u,const vector<vector<pair<int,int> > >& g,vector<int>& vis,const vector<int>& fD) { vis[u]=3; int mn=fD[u]; for(auto [v,w]:g[u]) { if(vis[v]==3) continue; mn=min(mn,getrep(v,g,vis,fD)); } return mn; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { vector<vector<pair<int,int> > > g(N); for(int i=0;i<M;i++) { g[A[i]].push_back({B[i],T[i]}); g[B[i]].push_back({A[i],T[i]}); } vector<int> D(N,0),sD(N,0),pD(N,0),fD(N,0),marked(N,-1); vector<int> vis(N,0); vector<int> reps; for(int i=0;i<N;i++) { if(vis[i]==0) { dfs(i,g,vis,D,sD,marked); dfs2(i,g,vis,D,sD,marked,pD); } } for(int i=0;i<N;i++) { fD[i]=max(D[i],pD[i]); } for(int i=0;i<N;i++) { if(vis[i]==2) { reps.push_back(getrep(i,g,vis,fD)); } } sort(reps.rbegin(),reps.rend()); /*for(auto& e:D) cout<<e<<" "; cout<<endl; for(auto& e:sD) cout<<e<<" "; cout<<endl; for(auto& e:pD) cout<<e<<" "; cout<<endl; for(auto& e:fD) cout<<e<<" "; cout<<endl; for(auto& e:reps) cout<<e<<" "; cout<<endl;*/ int ans=max(reps[0],*max_element(fD.begin(),fD.end())); if(reps.size()>1) ans=max(ans,L+reps[0]+reps[1]); if(reps.size()>2) ans=max(ans,2*L+reps[1]+reps[2]); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...