NOIP2018PJT4 對稱二叉樹

一年後回首此題,此乃暴力也。c++

遇到T4想暴力,這個基本的框架應該熟練掌握,這就是一個基本的學習經驗了,要造成這個直覺思惟,這個基本的意識你們再熟悉一下,沒AK NOIP就不該該了,對吧,誒。框架

#include<bits/stdc++.h>
using namespace std;
int w[1000005];
int a[1000005][2];
int s[1000005];
void dfs(int x)//求出以編號x的節點爲根的樹的節點數量
{
	s[x]=1;//根
	if(a[x][0]!=-1) dfs(a[x][0]),s[x]+=s[a[x][0]];//左子樹
	if(a[x][1]!=-1) dfs(a[x][1]),s[x]+=s[a[x][1]];//右子樹
}
bool dfs1(int x,int y)
{
	if(x==-1&&y==-1) return 1;//無左右子樹,即葉節點,對稱
	if(x!=-1&&y!=-1&&s[x]==s[y]&&w[x]==w[y])//左右相應位置比較
	{
		if(dfs1(a[x][0],a[y][1])&&dfs1(a[x][1],a[y][0])) return 1;//左左-右右,左右-右左
	}
	return 0;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);//輸入每一個節點的權值
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);//輸入左右孩子
	dfs(1);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(dfs1(a[i][0],a[i][1])) ans=max(ans,s[i]);//求出全部對稱二叉樹中節點最多的
	}
	printf("%d",ans);
	return 0;
} 

  關於NOIP,它壽終正寢了。一帆風順!學習

相關文章
相關標籤/搜索