D - Ki
・問題URL
https://atcoder.jp/contests/abc138/tasks/abc138_d
・発想
・youtubeのBFSゆっくり解説でみた問題。
・愚直にシミュレーションをするとO(NQ)でアウト。
・解法
・まず入力の分だけカウントして1から追っていき、親のカウンターの数を足していっても同じ。これはO(N)ゆえ、BFS,DFSだとO(N+Q)で解ける。
・コード
・BFS.ver
int main(){
int N,Q;
cin>>N>>Q;
Graph G(N);
vector<ll>count(N);
rep(i,N-1){
int a,b;
cin>>a>>b;
G[a-1].push_back(b-1);
G[b-1].push_back(a-1);
}
rep(i,Q){
int a,b;
cin>>a>>b;
count[a-1]+=b;
}
queue<int>que;
vector<bool>seen(N,false);
que.push(0);
seen[0]=true;
while (!que.empty()){
int v=que.front();
que.pop();
for(auto nv:G[v]){
if(seen[nv])continue;
seen[nv]=true;
count[nv]+=count[v];
que.push(nv);
}
}
rep(i,N)cout<<count[i]<<" ";
}
・DFS.ver(なぜか変数countをmain関数の外で宣言したらCEしたので名前をAに変更)
vector<bool>seen;
vector<int>A;
void dfs(const Graph &G,int v){
seen[v]=true;
for(auto nv:G[v]){
if(seen[nv])continue;
A[nv]+=A[v];
dfs(G,nv);
}
}
int main(){
int N,Q;
cin>>N>>Q;
Graph G(N);
rep(i,N-1){
int a,b;
cin>>a>>b;
G[a-1].push_back(b-1);
G[b-1].push_back(a-1);
}
A.resize(N);
rep(i,Q){
int a,b;
cin>>a>>b;
A[a-1]+=b;
}
seen.resize(N);
dfs(G,0);
rep(i,N)cout<<A[i]<<" ";
}
この記事が気に入ったらサポートをしてみませんか?