제출 #1145220

#제출 시각아이디문제언어결과실행 시간메모리
1145220calisovraduTriumphal arch (POI13_luk)C++20
30 / 100
688 ms31184 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<int>> v; vector<int> depth; vector<int> dp; vector<bool> checked; int n,maxim=0,crews; bool ok=true; void dfs(int left, int node){ deque <int> q; left+=crews; for(int i=0;i<v[node].size();i++){ int newnod = v[node][i]; if(checked[newnod]==false){ checked[newnod]=true; q.push_back(newnod); left--; } } if(left<0) ok = false; else{ while(!q.empty()){ dfs(left,q.front()); q.pop_front(); } } } bool verif(int mij){ ok = true; crews=mij; checked[1]=true; dfs(0,1); if(ok==true) return true; return false; } void fix(){ for(int i=1;i<=n;i++) checked[i]=false; } int main() { cin>>n; v.resize(n+1); depth.resize(n+1); dp.resize(n+1); checked.resize(n+1); for(int i=1;i<=n-1;i++){ int a,b; cin>>a>>b; v[a].push_back(b); v[b].push_back(a); } depth[1]=1; queue<int> q; q.push(1); while(!q.empty()){ int nod = q.front(),conex=0; q.pop(); for(int i=0;i<v[nod].size();i++){ int newnod = v[nod][i]; if(depth[newnod]==0){ depth[newnod]=depth[nod]+1; maxim=max(maxim,depth[newnod]); q.push(newnod); conex++; } } dp[depth[nod]]=max(dp[depth[nod]],conex); } int l=0,r=n,mij,corect=n; while(l<=r){ fix(); mij=(l+r)/2; bool res = verif(mij); if(res==true){ corect=min(mij,corect); r=mij-1; }else l=mij+1; } cout<<corect; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...