제출 #338143

#제출 시각아이디문제언어결과실행 시간메모리
338143nandonathaniel꿈 (IOI13_dreaming)C++14
0 / 100
45 ms11248 KiB
#include "dreaming.h" #include "bits/stdc++.h" using namespace std; typedef pair<int,int> pii; const int MAXN=100005; vector<pii> adj[MAXN]; vector<int> kel[MAXN]; int par[MAXN]; int find(int x){ if(par[x]==x)return x; return par[x]=find(par[x]); } void join(int a,int b){ par[find(a)]=find(b); } int jarak; void dfs(int now,int par,int dist){ jarak=max(jarak,dist); for(auto nxt : adj[now]){ if(nxt.first==par)continue; dfs(nxt.first,now,dist+nxt.second); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { for(int i=1;i<=N;i++)par[i]=i; for(int i=0;i<M;i++){ A[i]++;B[i]++; adj[A[i]].push_back({B[i],T[i]}); adj[B[i]].push_back({A[i],T[i]}); join(A[i],B[i]); } for(int i=1;i<=N;i++)kel[find(i)].push_back(i); vector<int> v; int ans=0; for(int i=1;i<=3;i++){ //for every tree, find root s.t the distance between the root and the furthest leaf is minimum if(kel[i].empty())continue; jarak=0; dfs(kel[i][0],-1,0); int furthest=jarak,diameter=jarak; for(int j=1;j<(int)kel[i].size();j++){ jarak=0; dfs(kel[i][j],-1,0); furthest=min(furthest,jarak); diameter=max(diameter,jarak); } v.push_back(furthest); ans=max(ans,diameter); } if(v.size()==2)ans=max(ans,v[0]+v[1]+L); // else assert(0); 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...