ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1018. Двоичная яблоня

Why I get WA? Pelase, help me!!!!!!! And what should I do if the branch contain 0 apples?(+)
Послано Nazarov Denis (nsc2001@rambler.ru) 12 фев 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:
Послано Ivan Georgiev 14 фев 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(+)
Послано Nazarov Denis (nsc2001@rambler.ru) 15 фев 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 ! ! !
Послано Nazarov Denis (nsc2001@rambler.ru) 15 фев 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.
>