题意
给你一棵 n 个节点的树以及每个节点的度 a[i] ,问是否能构成两颗不同构的树
分析
首先考虑两颗度一样的树,当叶子节点(度为 1 的点)插法不同时,一定不同构(同构要求完全等价,连法不同说明有不一样的边)。(必要性)因为给的度是合法的,所以叶子节点只要不把非叶子节点插满(无法继续连边),最后都可以构成合法树。
假设度为1的点只有一种插法,那不同构只能是树干不一样,但树干不一样要求有冗余的非叶子节点,而它的度一定大于1,就可以造成至少1点贡献,这导致度为1的点不止一种插法,矛盾。所以当度固定时,如果有不同构的树,叶子节点必有不同插法。(充分性)
这样问题就可以转化为:判断度为 1 的点在非叶子节点上有没有不同的插法。分类讨论一下即可,注意细节。
代码
#include<iostream>
using namespace std;
const int maxn=200010;
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int ma=0,v=0,s=0,s2=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
ma=max(a[i],ma);
if(a[i]==1)s++;
else s2=s2+a[i]-1;
if(i-s-1>1)v=1;
}
if(s>=s2||ma==2)cout<<"No\n";
else if(s2-s==1&&a[s+1]==a[n])cout<<"No\n";
else cout<<"Yes\n";
}
return 0;
}