您的位置:首页 > 其它

bzoj 1149 [CTSC2007]风玲Mobiles dfs

2017-02-19 22:23 357 查看
题意:给定一棵完全二叉树,可以交换某个节点的左右儿子,求最少交换多少次可以使所有的叶节点深度相差不超过1,且深度较大的叶节点都在深度较小的叶节点左侧(来自po姐)。

题解:其实这题你看懂题目你就赢了。。。直接做。。这应该是CTSC中最水的一道了巴。dfs两遍,随便跑。然而并没有1A,因为空间开小了。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int N=1e6;
int l
,r
,ans,minx=1e9,maxx,n;
inline void dfs(int x,int dep)
{
if (x==-1)
{
maxx=max(maxx,dep);
minx=min(minx,dep);
return;
}
dfs(l[x],dep+1);
dfs(r[x],dep+1);

}
inline int solve(int x,int dep)
{
int a,b;
if (x==-1)
{
if (dep==minx)return 1;
return 2;
}
a=solve(l[x],dep+1);
b=solve(r[x],dep+1);
if (a==1&&b==2||a==1&&b==3||a==3&&b==2) ans+=1;
if (a==3&&b==3){printf("-1\n");exit(0);}
return a|b;
}
int main()
{
scanf("%d",&n);
fo(i,1,n)scanf("%d%d",&l[i],&r[i]);
dfs(1,0);
if (maxx-minx>=2)
{
printf("-1\n");
return 0;
}
if (maxx==minx)
{
printf("0\n");
return 0;
}
solve(1,0);
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs