思路:
枚举+树的dfs序。参考了https://leetcode.cn/problems/minimum-score-after-removals-on-a-tree/solution/dfs-shi-jian-chuo-chu-li-shu-shang-wen-t-x1kk/。
实现:
1 class Solution { 2 public: 3 int dfs(int x,int p,vector<int>&nums,vector<int>&sum,vector<int>&in,vector<int>&out,int&cnt,vector<vector<int>>&g,vector<int>&par){ 4 par[x]=p; 5 cnt++; 6 in[x]=cnt; 7 int res=nums[x]; 8 for(int i=0;i<g[x].size();i++){ 9 int to=g[x][i]; 10 if(to==p){ 11 continue; 12 } 13 int tmp=dfs(to,x,nums,sum,in,out,cnt,g,par); 14 res^=tmp; 15 } 16 sum[x]=res; 17 out[x]=cnt; 18 return res; 19 } 20 bool check(int x,int y,vector<int>&in,vector<int>&out){ 21 if(x==y)return true; 22 return in[x]<in[y] and in[y]<=out[x]; 23 } 24 int minimumScore(vector<int>& nums, vector<vector<int>>& edges) { 25 int n=nums.size(); 26 vector<vector<int>>g(n,vector<int>()); 27 for(int i=0;i<edges.size();i++){ 28 int x=edges[i][0]; 29 int y=edges[i][1]; 30 g[x].push_back(y); 31 g[y].push_back(x); 32 } 33 vector<int>in(n,0),out(n,0),sum(n,0),par(n,-1); 34 int cnt=0; 35 dfs(0,-1,nums,sum,in,out,cnt,g,par); 36 int res=0x3f3f3f3f; 37 for(int i=0;i<n-1;i++){ 38 for(int j=0;j<n-1;j++){ 39 if(i==j){ 40 continue; 41 } 42 int x1=edges[i][0],y1=edges[i][1]; 43 if(par[x1]==y1){ 44 swap(x1,y1); 45 } 46 int x2=edges[j][0],y2=edges[j][1]; 47 if(par[x2]==y2){ 48 swap(x2,y2); 49 } 50 int a=0,b=0,c=0; 51 if(check(y1,x2,in,out)){ 52 a=sum[y2]; 53 b=sum[y1]^sum[y2]; 54 c=sum[0]^sum[y1]; 55 } 56 else if(check(y2,x1,in,out)){ 57 a=sum[y1]; 58 b=sum[y1]^sum[y2]; 59 c=sum[0]^sum[y2]; 60 } 61 else{ 62 a=sum[y1]; 63 b=sum[y2]; 64 c=sum[0]^sum[y1]^sum[y2]; 65 } 66 int minn=min(a,min(b,c)); 67 int maxn=max(a,max(b,c)); 68 res=min(res,maxn-minn); 69 } 70 } 71 return res; 72 } 73 };