Description
Input
![BZOJ1149[CTSC2007]风玲Mobiles BZOJ1149[CTSC2007]风玲Mobiles](https://image.miaokee.com:8440/aHR0cDovL3d3dy5seWRzeS5jb20vSnVkZ2VPbmxpbmUvaW1hZ2VzLzExNDlfNC5qcGc%3D.jpg?w=700&webp=1)
Output
输出仅包含一个整数。表示最少需要多少次交换能使风铃满足Ike的条件。如果不可能满足,输出-1。
Sample Input
6
2 3
-1 4
5 6
-1 -1
-1 -1
-1 -1
2 3
-1 4
5 6
-1 -1
-1 -1
-1 -1
Sample Output
2
题解:
直接一次DFS即可。
若两棵子树中玩具深度差>1,输出-1。
若两颗子数内部玩具深度差都>0,输出-1。
若左子树中存在比右子树深度小的玩具,inc(ans)。
我竟然WA了一发,可悲。
代码:
uses math;
var
i,j,k,l,n,m,cnt,ans:longint;
a:array[..,..]of longint;
dep,mi,ma:array[..]of longint;
function ss(x,fa,y:longint):longint;
begin
if x=- then
begin
inc(cnt); dep[cnt]:=dep[fa]+; a[fa,y]:=cnt;
mi[cnt]:=dep[cnt]; ma[cnt]:=dep[cnt];
exit;
end;
dep[x]:=dep[fa]+;
ss(a[x,],x,); ss(a[x,],x,);
if ma[a[x,]]-mi[a[x,]]> then begin writeln(-); halt; end;
if ma[a[x,]]-mi[a[x,]]> then begin writeln(-); halt; end;
if(ma[a[x,]]-mi[a[x,]]>)and(ma[a[x,]]-mi[a[x,]]>)then
begin writeln(-); halt; end;
ma[x]:=max(ma[a[x,]],ma[a[x,]]); mi[x]:=min(mi[a[x,]],mi[a[x,]]);
if mi[a[x,]]<ma[a[x,]] then inc(ans);
end;
begin
readln(n); cnt:=n;
for i:= to n do readln(a[i,],a[i,]);
ss(,,); writeln(ans);
end.