qoj 8813. Records in Chichén Itzá

题意

给你一棵 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;
 } 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值