Submission #882123

#TimeUsernameProblemLanguageResultExecution timeMemory
882123nikdDreaming (IOI13_dreaming)C++17
0 / 100
30 ms14164 KiB
#include <bits/stdc++.h> #include "dreaming.h" #define MAXN 100001 using namespace std; int f; int max_dis; int par[MAXN]; int cont=0; vector<int> mintree; bool vis[MAXN]; vector<pair<int, int>> adj[MAXN]; int dist[MAXN]={}; void dfs1(int v, int p){ vis[v]=true; for(auto u: adj[v]){ if(u.first!=p){ dist[u.first]=dist[v]+u.second; if(dist[u.first]>max_dis){ max_dis=dist[u.first]; f=u.first; } dfs1(u.first, v); } } } void dfs2(int v, int p){ par[v]=p; for(auto u: adj[v]){ if(u.first!=p){ dist[u.first]=dist[v]+u.second; if(dist[u.first]>max_dis){ max_dis=dist[u.first]; f=u.first; } dfs2(u.first, v); } } } int travelTime(int N, int M, int L, int A[], int B[], int T[]){ for(int i = 0; i<M; i++){ adj[A[i]].push_back({B[i], T[i]}); adj[B[i]].push_back({A[i], T[i]}); } for(int i = 0; i<N; i++) vis[i]=false; for(int i = 0; i<N; i++){ if(!vis[i]){ mintree.push_back(INT_MAX); max_dis=0; f=0; dist[i]=0; dfs1(i, i); int a = f; dist[a]=0; max_dis=0; dfs2(a, a); int b = f; int d= max_dis/2; int last=-1; while(dist[b]>d){ last=b; b=par[b]; } if(last==-1){ mintree[cont]=dist[b]; } else{ mintree[cont]=min(dist[last], max_dis-dist[b]); } cont++; } } sort(mintree.begin(), mintree.end()); int sol; int n = cont; if(n==2){ sol = mintree[0]+mintree[1]+L; } if(n==1) sol =mintree[0]; else{ sol=max(mintree[n-1]+mintree[n-2]+L, mintree[n-2]+mintree[n-3]+2*L); } return sol; }
#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...