魈凯KBS • 4个月前
先说明一下,不懂的people抄题解可耻啊[○・`Д´・ ○]
#include <bits/stdc++.h>
using namespace std;
bool flag; // 是否对称
int n, ans=1, l[1000001], r[1000001], v[1000001];
int dfs(int x, int y, int s) { // s代表节点数 x,y为正在访问的节点标号
if(x==-1 && y==-1)
return 0;
if(x==-1 || (y==-1 && x!=y)) { //判断左右对称
flag = 1;
return 0;
}
if(v[x] != v[y]) { //判断权值不对称
flag = 1;
return 0;
}
return dfs(l[x], r[y], 2) + dfs(r[x], l[y], 2) + s; // 下面节点数 加 上面节点数
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", v+i);
for(int i=1; i<=n; i++)
scanf("%d%d", l+i, r+i);
for(int i=1; i<=n; i++) {
int s = dfs(l[i], r[i], 3); // 直接从访问的节点的左孩子和右孩子开始, 初始节点为3
if(s>ans && flag==0)
ans = s;
flag = 0; // 清楚
}
printf("%d", ans);
return 0;
}
评论: