結果
問題 |
No.1817 Reversed Edges
|
ユーザー |
![]() |
提出日時 | 2022-02-13 21:07:35 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 591 ms / 2,000 ms |
コード長 | 2,309 bytes |
コンパイル時間 | 3,105 ms |
コンパイル使用メモリ | 274,616 KB |
実行使用メモリ | 32,256 KB |
最終ジャッジ日時 | 2024-06-29 05:47:23 |
合計ジャッジ時間 | 13,569 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 23 |
ソースコード
#include <bits/stdc++.h> using namespace std; struct tree{ vector<int> parent; int numberOfNodes=0; int root; tree(int N,vector<int>& a,int k=0){ parent=a; numberOfNodes=N; root=k; } tree(int N,set<vector<int>>& edges,int k=0){ root=k; numberOfNodes=N; parent.resize(N); fill(parent.begin(),parent.end(),-1); map<int,set<int>> connected; for(vector<int> v:edges){ connected[v[0]].insert(v[1]); connected[v[1]].insert(v[0]); } queue<int> q; q.push(k); while(!q.empty()){ for(int i:connected[q.front()]){ if(i!=k&&parent[i]==-1){ parent[i]=q.front(); q.push(i); } } q.pop(); } } map<int,vector<int>> getChildren(){ map<int,vector<int>> ret; for(int i=0;i<numberOfNodes;++i){ if(i!=root){ ret[parent[i]].emplace_back(i); } } return ret; } vector<int> bfs(){ vector<int> order(1,root); map<int,vector<int>> children=getChildren(); for(int i=0;i<numberOfNodes;++i){ for(int j:children[order[i]]){ order.emplace_back(j); } } return order; } vector<int> getDepth(){ vector<int> depth(numberOfNodes); vector<int> order=bfs(); depth[root]=0; for(int i=1;i<numberOfNodes;++i){ depth[order[i]]=depth[parent[order[i]]]+1; } return depth; } }; int main(){ int N; cin>>N; set<vector<int>> edges; for(int i=0;i<N-1;++i){ vector<int> temp(2); for(int j=0;j<2;++j){ cin>>temp[j]; --temp[j]; } edges.insert(temp); } tree T(N,edges,0); vector<int> d=T.getDepth(),ans(N,0),ord=T.bfs(); for(vector<int> v:edges){ if(d[max(v[0],v[1])]<d[min(v[0],v[1])]){ ++ans[0]; --ans[min(v[0],v[1])]; }else{ ++ans[max(v[0],v[1])]; } } for(int i:ord){ if(i){ ans[i]+=ans[T.parent[i]]; } } for(int i=0;i<N;++i){ cout<<ans[i]<<endl; } }