(nice!!!)(LeetCode 每日一题) 2322. 从树中删除边的最小分数 (深度优先搜索dfs + 树)
题目:2322. 从树中删除边的最小分数
思路:参考大神的思路
C++版本:
class Solution {
public:int ct=0;void dfs(int u,int fa,vector<int>& nums, vector<vector<int>>& g,vector<int> &xr,vector<int> &in,vector<int> &out){in[u]=ct++;xr[u]=nums[u];for(auto x:g[u]){if (fa==x) continue;dfs(x,u,nums,g,xr,in,out);xr[u]^=xr[x];}out[u]=ct++;}int minimumScore(vector<int>& nums, vector<vector<int>>& edges) {int n=nums.size();vector<vector<int>> g(n);for(auto ed:edges){int x=ed[0],y=ed[1];g[x].push_back(y);g[y].push_back(x);}vector<int> xr(n),in(n),out(n);dfs(0,-1,nums,g,xr,in,out);int mn=INT_MAX;for(int i=2;i<n;i++){for(int j=1;j<i;j++){int a,b,c;if(in[i]<in[j]&&out[j]<out[i]){a=xr[j],b=xr[i]^xr[j],c=xr[0]^xr[i];}else if(in[j]<in[i]&&out[i]<out[j]){a=xr[i],b=xr[j]^xr[i],c=xr[0]^xr[j];}else{a=xr[i],b=xr[j],c=xr[0]^xr[i]^xr[j];}mn=min(mn,max({a,b,c})-min({a,b,c}));}}return mn;}
};