この問題についてです
解法としては、木に対していもす法を使うだけなのですが、解説(の注釈)にある
「a[i]がb[i]の親であるとは限らず、再帰関数を用いる必要がある」
という部分が理解できません
私は初め、以下のようなコードを提出しました
using namespace std; typedef long long ll; const ll INF = 1e9; const ll mod = 1e9+7; typedef pair<int,int> P; #define rep(i,N) for(int i=0;i<N;i++) #define rep2(i,m,N) for(int i=m;i<N;i++) #define mm(n,m) memset(n,m,sizeof(n)) int main(){ ll n,q; cin>>n>>q; ll a[n],b[n]; ll p[q],x[q]; mm(a,0); mm(b,0); mm(p,0); mm(x,0); vector<ll>tr[n]; rep(i,n-1){ cin>>a[i]>>b[i]; tr[a[i]].push_back(b[i]); } ll ans[n+1]; mm(ans,0); rep(i,q){ cin>>p[i]>>x[i]; ans[p[i]]+=x[i]; } for(int i=1;i<n;i++){ int d = tr[i].size(); for(int j=0;j<d;j++){ ans[tr[i][j]] += ans[i]; } } for(int i=1;i<=n;i++)cout<<ans[i]<<" "; cout<<endl; } コード
vectorで親のindexに子をプッシュしていき、伝播させていく感じです
しかしこの方法では正解できませんでした
最終的に、伝播させていく部分のループを再帰を用いた深さ優先探索に書き換え、vectorで子から親への辺を張るコード(tr[b[i]].push_back(a[i]);)を追加することで正解することができました
しかし、私の頭では、a[i]<b[i]なのだから、元のコードで良いのではないか、また、子から親へも辺を張る必要があるのか(それをしないといけないケースがどのようなものか)、イマイチ分かりません
どなたか分かる方いらっしゃいましたらアドバイスお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。