題解 | #好子樹#
好子樹
http://www.fangfengwang8.cn/practice/aca56bd0c9414c71b94d3a2851f4e0e7
#include <iostream> #include <vector> using namespace std; int dfs(int p,vector<vector<int>> &edges,vector<int> &nums,int &maxnum,int &minnum){ int ma=nums[p],mi=nums[p],n=0; for(auto a:edges[p]) n+=dfs(a,edges,nums,ma,mi); maxnum=max(maxnum,ma); minnum=min(minnum,mi); if((ma-mi)%2==1){ n++; nums[p]=-1; } return n; } int main() { int n,u,v; cin>>n; vector<int> nums(n); vector<vector<int>> edges(n); for(int i=0;i<n;i++) cin>>nums[i]; while(cin>>u>>v) edges[u-1].emplace_back(v-1); int maxnum=nums[0],minnum=nums[0]; cout<<dfs(0,edges,nums,maxnum,minnum)<<endl; for(int i=0;i<n;i++) if(nums[i]==-1) cout<<i+1<<' '; return 0; }
利用dfs深度優(yōu)先搜索解題。nums數(shù)組存儲(chǔ)節(jié)點(diǎn)權(quán)值,edges二維數(shù)組存儲(chǔ)邊。對(duì)于一個(gè)節(jié)點(diǎn),搜索其下一節(jié)點(diǎn),并返回子樹的最大最小值。若差值為奇數(shù)則為將該節(jié)點(diǎn)p標(biāo)記(可直接將nums[p]賦值為-1來(lái)標(biāo)記以節(jié)省空間,反正后續(xù)也不再需要用到p的權(quán)值)