Программируем

Пожалуйста, зарегистрируйтесь или войдите под уже созданным логином. Вы получите полный доступ ко всем статьям форума.

Join the forum, it's quick and easy

Программируем

Пожалуйста, зарегистрируйтесь или войдите под уже созданным логином. Вы получите полный доступ ко всем статьям форума.

Программируем

Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Программируем

На нашем форуме программистов вы сможете найти софт для программирования и другие программы. На форуме обсуждаются многие языки программирования, задачи и их решения. Используются языки: C, Assembler, Pascal, Delphi, Flash и другие.

Последние темы

» Арена искусственных интеллектов Gridwars
Двоичная яблоня EmptyСр Окт 12, 2016 2:43 am автор SeriousPasha

» требуется несколько JS разработчиков
Двоичная яблоня EmptyПт Окт 07, 2016 10:19 pm автор mrktwn1

» Защита приложения от взлома
Двоичная яблоня EmptyЧт Июн 18, 2015 10:28 pm автор stradi

» Ищите программиста или дизайнера?
Двоичная яблоня EmptyПт Мар 27, 2015 6:25 am автор фриланс

» Создание и продвижение сайтов, их развитие.
Двоичная яблоня EmptyСр Мар 25, 2015 12:40 am автор asdfghhgfdsa

» Исходники для студентов + скайп-консультации,помощь в написании программ
Двоичная яблоня EmptyВт Окт 07, 2014 11:25 pm автор Horpion

» IT- технологии для развития бизнеса
Двоичная яблоня EmptyПн Июн 23, 2014 6:11 pm автор dvos12

» Стенли Кубрик "С Широко закрытыми Глазами"
Двоичная яблоня EmptyЧт Июн 12, 2014 2:01 am автор Vertuozzz

» Каталог популярных хостинг компаний
Двоичная яблоня EmptyСб Май 10, 2014 7:18 pm автор naik

Самые активные пользователи

Aster (142)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Exkalibur (89)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Чебурашка (63)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Administrator (34)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
ak95 (8)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Пушкин (7)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
K4_ (7)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
LuDa (7)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Goldcoding (6)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 
Admin (6)
Двоичная яблоня Bar_leftДвоичная яблоня BarДвоичная яблоня Bar_right 

Партнеры

Двоичная яблоня Top100 Rambler's Top100

    Двоичная яблоня

    avatar
    aka_GRAD
    Новичек
    Новичек


    Сообщения : 1
    Очки : 3
    Репутация : 0
    Дата регистрации : 2011-05-18

    Двоичная яблоня Empty Двоичная яблоня

    Сообщение автор aka_GRAD Ср Май 18, 2011 3:07 am

    Вот такая задачка

    Яблоня называется двоичной, если в каждой точке ветвления ствол или ветвь разветвляется надвое. Точки ветвления, корень и концы веток - это узлы дерева. Известна масса каждого участка яблони между двумя соседними узлами. Первоначально в яблоне N узлов, а нужно оставить M. Яблоню можно резать в основаниях ветвей, при этом ветвь и вся часть дерева, растущая выше, удаляются.

    Исходные данные: N, M (1 < M < N ≤ 100) и список из N-1 тройки. Каждая тройка содержит номера узлов, определяющих участок и его массу (узлы перенумерованы от 1 до N).

    Напишите программу, которая вводит исходные данные и находит план подрезки дерева, оставляющий наименьшую суммарную массу оставшихся участков.

    Например, для исходных данных: N=8, M=3 и набора троек (1, 2, 19), (2, 4, 13), (3, 2, 12), (3, 8, 17), (3, 6, 11), (5,8,10) и (8,7,Cool, вывод программы может быть следующим:


    Обрезать ветки: (2,4),(3,Cool,(3,6).

    Ну вот я написал программу точнее собрал по кусочкам. И у меня программа зацикливается на функции поиска в глубину.
    USES crt;
    Код:

    const
      MAX_SIZE = 8;
      MIN_VALUE = -3600; { -5e4; }
      ds : array [1..Max_Size, 1..Max_Size] of integer = ((0,19,0,0,0,0,0,0),
                                                      (19,0,12,13,0,0,0,0),
                                                      (0,12,0,0,0,11,0,17),
                                                      (0,13,0,0,0,0,0,0),
                                                      (0,0,0,0,0,0,0,10),
                                                      (0,0,11,0,0,0,0,0),
                                                      (0,0,0,0,0,0,0,8),
                                                      (0,0,17,0,10,0,8,0));
    type
      edge = record
        num, weight: integer;
      end;

      vertex = record
        left, right: edge;
      end;

    var
      n, i,jk, totalEdges: integer;
      adjMatrix: array [1 .. MAX_SIZE, 1 .. MAX_SIZE] of integer;
      { матрица смежности }
      adj: array [1 .. MAX_SIZE ] of vertex; { двоичное дерево }
      edgesAmount: array [1 .. MAX_SIZE ] of integer;
      mem: array [1 .. MAX_SIZE , 1 .. MAX_SIZE ] of integer;

    procedure dfs(num: integer);
    var
      isLeft: boolean;
      i: integer;
    begin
      isLeft := true;
      for i := 1 to n  do
      begin
        if (adjMatrix[num][i] <> 0) then
        begin
          if (isLeft) then
          begin
            adj[num].left.num := i;
            adj[num].left.weight := adjMatrix[num, i];
          end
          else
          begin
            adj[num].right.num := i;
            adj[num].right.weight := adjMatrix[num, i];
          end;
          isLeft := false;
          adjMatrix[num][i] := 0;
          adjMatrix[i][num] := 0;

          dfs(i);

          edgesAmount[num] := edgesAmount[num] + edgesAmount[i] + 1;
        end;
      end; { FOR }
    end; { Procedure }

    procedure input;
    var
      f, s, w: integer;
    begin
      read(n);
      read(totalEdges);
      {for i := 1 to n do
      begin
        read(f);
        read(s);
        read(w);
        adjMatrix[f, s] := w;
        adjMatrix[s, f] := w;}
      For i:=1 to n do
      For jk:=1 to n do
        adjMatrix[i,jk]:=ds[i,jk];

      dfs(1);
    end;

    function max(a, b: integer): integer;
    begin
      if (a > b) then
        max := a
      else
        max := b;
    end;

    function f(num, edges: integer): integer;
    var
      left, right: edge;
      res, rightEdges, leftEdges, leftValue, rightValue, cur: integer;
    begin
      left := adj[num].left;
      right := adj[num].right;

      if (mem[num, edges] <> 0) then
            f := mem[num, edges]
      else
      if (edges = 0) then
            f := 0
      else
      if (edges > edgesAmount[num]) then
            f := MIN_VALUE
      else
      if (edges = 1) then
            f := max(left.weight, right.weight);

        res := 0;
      for i := 1 to edges do
      begin
            leftEdges := i;
            rightEdges := edges - i;

            leftValue := 0;
            rightValue := 0;
        if (leftEdges <> 0) then
          leftValue := left.weight + f(left.num, leftEdges - 1);
        if (rightEdges <> 0) then
          rightValue := right.weight + f(right.num, rightEdges - 1);
        cur := leftValue + rightValue;
        res := max(res, cur);
      end;
      mem[num][edges] := res;
      f := res;
    end;

    procedure solve;
    var
      res: integer;
    begin
      res := f(1, totalEdges);
      write(res, ' ');
    end;

    BEGIN
      input;
      solve;

    END.

      Текущее время Пт Май 03, 2024 1:10 am