ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1018. Binary Apple Tree

Why I get WA? Pelase, help me!!!!!!! And what should I do if the branch contain 0 apples?(+)
Posted by Nazarov Denis (nsc2001@rambler.ru) 12 Feb 2002 11:17
My program:

Program t1018;

Const MaxN=100;

Var  N,Q,i,j,k   : integer;
     B           : array[1..MaxN-1,1..3]of integer;
     W,L,P       : array[1..MaxN]of integer;
     D           : array[1..MaxN,0..MaxN,1..2]of integer;
                        {1 - preserved;2 - delete}
     Ex          : boolean;
     maxl,t1,t2  : integer;
     a1,a2,b1,b2 : integer;

Procedure GetT(Num : integer; Var Num1,Num2 : integer);
Var i,j  : integer;
 begin
  j:=0;
  for i:=1 to N-1 do
   if (B[i,1]=Num)and(L[Num]<L[B[i,2]]) then begin
     if j=0 then Num1:=B[i,2] else Num2:=B[i,2];
     j:=j+1;
    end else
   if (B[i,2]=Num)and(L[Num]<L[B[i,1]]) then begin
     if j=0 then Num1:=B[i,1] else Num2:=B[i,1];
     j:=j+1;
    end;
 end;

begin
 Read(N,Q);
 for i:=1 to N-1 do Read(B[i,1],B[i,2],B[i,3]);
 fillchar(L,SizeOf(L),0);
 L[1]:=1;
 j:=0;
 Repeat
  Ex:=true;
  j:=j+1;
  for i:=1 to N-1 do
   if (L[B[i,1]]=j)and(L[B[i,2]]=0) then begin
    L[B[i,2]]:=j+1;
    Ex:=false;
   end else if (L[B[i,1]]=0)and(L[B[i,2]]=j) then begin
    L[B[i,1]]:=j+1;
    Ex:=false;
   end;
 Until Ex;
 maxl:=j;
 for i:=1 to N-1 do
  if L[B[i,1]]>L[B[i,2]] then W[B[i,1]]:=B[i,3] else W[B[i,2]]:=B
[i,3];
 for i:=1 to MaxN do
  for j:=0 to MaxN do
   for k:=1 to 2 do
    D[i,j,k]:=-1;
 fillchar(P,SizeOf(P),0);
 for i:=1 to N-1 do
  if L[B[i,1]]<L[B[i,2]] then P[B[i,1]]:=P[B[i,1]]+1 else P[B[i,2]]:=P
[B[i,2]]+1;
 for i:=1 to N do
  if P[i]=0 then begin
   D[i,1,1]:=W[i];
  end;
 for j:=maxl-1 downto 1 do
  for i:=1 to N do
   if (L[i]=j)and(P[i]>0) then begin
    GetT(i,t1,t2);
    D[i,0,2]:=0;
    if P[i]=2 then
    for a1:=0 to MaxN do
     for b1:=1 to 2 do if D[t1,a1,b1]<>-1 then
      for a2:=0 to MaxN do
       for b2:=1 to 2 do if D[t2,a2,b2]<>-1 then
        if D[i,a1+a2+1,1]<D[t1,a1,b1]+D[t2,a2,b2]+W[i] then
         D[i,a1+a2+1,1]:=D[t1,a1,b1]+D[t2,a2,b2]+W[i];
    if P[i]=1 then
    for a1:=0 to MaxN do
     for b1:=1 to 2 do if D[t1,a1,b1]<>-1 then
       if D[i,a1+1,1]<D[t1,a1,b1]+W[i] then
         D[i,a1+1,1]:=D[t1,a1,b1]+W[i];
   end;
 Writeln(D[1,Q+1,1]);
end.
Re:
Posted by Ivan Georgiev 14 Feb 2002 13:45
You should just ignore it.
For example this test:

7 4
1 2 10
1 4 30
2 3 50
2 6 0
4 5 40
4 7 0

The answer seems to be 130, but it is not, because we keep the 0
apple branches -- it is 70; just assume the 0 branches do not exist
and solve the problem for q - number of 0 branches;
for example the test case above should be considered this way:
4 2
1 2 10
1 4 30
2 3 50
4 5 40

Good luck.
I ignore it,but I get WA. Can you say me that I should do if branch with 0 apples have sub-branch(+)
Posted by Nazarov Denis (nsc2001@rambler.ru) 15 Feb 2002 15:36
Program t1018;

Const MaxN=100;

Var  N,Q,i,j,k   : integer;
     B           : array[1..MaxN-1,1..3]of integer;
     W,L,P       : array[1..MaxN]of integer;
     D           : array[1..MaxN,0..MaxN,1..2]of integer;
                        {1 - preserved;2 - delete}
     Ex          : boolean;
     maxl,t1,t2  : integer;
     a1,a2,b1,b2 : integer;

Procedure GetT(Num : integer; Var Num1,Num2 : integer);
Var i,j  : integer;
 begin
  j:=0;
  for i:=1 to N-1 do
   if (B[i,1]=Num)and(L[Num]<L[B[i,2]]) then begin
     if j=0 then Num1:=B[i,2] else Num2:=B[i,2];
     j:=j+1;
    end else
   if (B[i,2]=Num)and(L[Num]<L[B[i,1]]) then begin
     if j=0 then Num1:=B[i,1] else Num2:=B[i,1];
     j:=j+1;
    end;
 end;

begin
 Read(N,Q);
 for i:=1 to N-1 do Read(B[i,1],B[i,2],B[i,3]);
 i:=0;
 while i<=N-1 do begin
  i:=i+1;
  if B[i,3]=0 then begin
    N:=N-1;
    Q:=Q-1;
    if i=N then break;
    B[i]:=B[N];
    i:=i-1;
   end;
  end;
 fillchar(L,SizeOf(L),0);
 L[1]:=1;
 j:=0;
 Repeat
  Ex:=true;
  j:=j+1;
  for i:=1 to N-1 do
   if (L[B[i,1]]=j)and(L[B[i,2]]=0) then begin
    L[B[i,2]]:=j+1;
    Ex:=false;
   end else if (L[B[i,1]]=0)and(L[B[i,2]]=j) then begin
    L[B[i,1]]:=j+1;
    Ex:=false;
   end;
 Until Ex;
 maxl:=j;
 for i:=1 to N-1 do
  if L[B[i,1]]>L[B[i,2]] then W[B[i,1]]:=B[i,3] else W[B[i,2]]:=B
[i,3];
 for i:=1 to MaxN do
  for j:=0 to MaxN do
   for k:=1 to 2 do
    D[i,j,k]:=-1;
 fillchar(P,SizeOf(P),0);
 for i:=1 to N-1 do
  if L[B[i,1]]<L[B[i,2]] then P[B[i,1]]:=P[B[i,1]]+1 else P[B[i,2]]:=P
[B[i,2]]+1;
 for i:=1 to N do
  if P[i]=0 then
   D[i,1,1]:=W[i];
 for j:=maxl-1 downto 1 do
  for i:=1 to N do
   if (L[i]=j)and(P[i]>0) then begin
    GetT(i,t1,t2);
    D[i,0,2]:=0;
    if P[i]=2 then
    for a1:=0 to MaxN do
     for b1:=1 to 2 do if D[t1,a1,b1]<>-1 then
      for a2:=0 to MaxN do
       for b2:=1 to 2 do if D[t2,a2,b2]<>-1 then
        if D[i,a1+a2+1,1]<D[t1,a1,b1]+D[t2,a2,b2]+W[i] then
         D[i,a1+a2+1,1]:=D[t1,a1,b1]+D[t2,a2,b2]+W[i];
    if P[i]=1 then
    for a1:=0 to MaxN do
     for b1:=1 to 2 do if D[t1,a1,b1]<>-1 then
       if D[i,a1+1,1]<D[t1,a1,b1]+W[i] then
         D[i,a1+1,1]:=D[t1,a1,b1]+W[i];
   end;
 Writeln(D[1,Q+1,1]);
end.
Sorry for my last message. I misunderstood you. Now I get AC. Thank you very much ! ! !
Posted by Nazarov Denis (nsc2001@rambler.ru) 15 Feb 2002 16:18
> You should just ignore it.
> For example this test:
>
> 7 4
> 1 2 10
> 1 4 30
> 2 3 50
> 2 6 0
> 4 5 40
> 4 7 0
>
> The answer seems to be 130, but it is not, because we keep the 0
> apple branches -- it is 70; just assume the 0 branches do not exist
> and solve the problem for q - number of 0 branches;
> for example the test case above should be considered this way:
> 4 2
> 1 2 10
> 1 4 30
> 2 3 50
> 4 5 40
>
> Good luck.
>