Musala Soft Logo Конкурс по програмиране на Musala Soft и PC Magazine Bulgaria PC Magazine Bulgaria Logo
  Състезателна система
Сезон 2010 - 2011
Сезон 2009 - 2010
Сезон 2008 - 2009
Сезон 2007 - 2008
Сезон 2006 - 2007
Сезон 2005 - 2006
Сезон 2004 - 2005
Сезон 2003 - 2004
Сезон 2002 - 2003
Сезон 2001 - 2002
Правила
Задача 1
Задача 2
Задача 3
Задача 4
Задача 5
Задача 6
Класиране
Финален кръг
Сезон 2000 - 2001
Задача 4 - ТРЪБОПРОВОД - Анализ


За решението на четвъртата конкурсна задача са важни само точките с цели координати. Затова да направим едно традиционно преобразуване - вместо координатна система, да разгледаме безкрайна мрежа от клетки, в която на всяка точка с цели координати е съпоставена съответна клетка. Ако точка със зададени координати е част от преградна стена, то съответната й клетка ще е запълнена. В противен случай клетката ще бъде празна (вж. фигура 1).

За решението на задачата са важни не дължините на отделните части от тръбопровода, а броят на колената. Затова първо ще трансформираме изложбеното пространство до еквивалентно на него с по-малки размери, за което след това по-лесно ще намерим тръбопровод с минимален брой колена. Идеята на трансформацията е следната. Да разгледаме две преградни стени успоредни на ординатната ос (т.е. във всяка от тях клетките имат равни х-координати). Ако стените са долепени една до друга (разликата в х-координатите им е 1), очевидно между тях не може да се построи тръбопровод. Ако не са долепени (разликата в x-координатите им е 2 или повече), тогава очевидно между тях може да се построи тръбопровод. Частта от оптимален по брой колена тръбопровод, преминаваща между две успоредни стени, винаги е успоредна на стените. Затова, разстоянието между такива две стени може да бъде сведено до 2, ако то е по-голямо. При стените успоредни на абсцисата нещата са аналогични. За трансформиране на изложбеното пространство (както по х- така и по у- координати) прилагаме следната процедура:
  • сортираме точките, които са краища на преградните стени, включително началото и края на тръбопровода, по съответната координатата;
  • на координатата на първата точка съпоставяме 2 (да не забравяме че за да бъде оптимален тръбопроводът може да се наложи да “заобиколи” всички стени отляво/отдолу);
  • нека координата на последната обработена точка е q, а на текущата е r. Ако на координатата на последната обработена точка сме съпоставили q’, то на текущата ще съпоставим r’, като ако r-q=0, то r’= q’, ако r-q = 1, то r’ = q’+1, а ако r-q >= 2, то r’ = q’+2;
  • нека u е стойността съпоставена на последната от сортираните x-координати, а v е стойността съпоставена на последната от сортираните y-координати.

  • Така трансформирахме изложбеното пространство до правоъгълника
    P={(x,y) | 1<= x<=u+1, 1<=y<=v+1}.
    Фигура 2 илюстрира описаната трансформация. При този начин на опростяване u,v <= 2*M, където M е броят на всички сортирани точки. Според условието N <= 100. Следователно M=2*N+2<=2*100+2 и u,v<=2*(2*100+2)=404 т.е. максималният интервал в който бихме могли да разглеждаме коя да е от двете координати е [1, 405].

    Сведохме задачата за намиране на път от зададена клетка до друга зададена клетка в правоъгълна мрежа не по-голяма от 405x405, като пътят трябва да е с минимален брой завои (колена). Тази задача може да бъде решена с различни вариации на стандартните алгоритми за намиране на най-къс път в граф или обхождане в широчина. От всяка празна клетка на мрежата да направим два върха на граф - vh и vv (единият съответстващ на достигане на клетката с движение по хоризонтал, а другия - по вертикал). Двата върха vh и vv са свързани с ребро, теглото на което е 1. Всеки “хоризонтален” връх е свързан с хоризонталните върхове на съседните по хоризонтала празни клетки с ребро, теглото на което е 0. По същия начин всеки “вертикален” връх е свързан с вертикалните върхове на съседните по вертикала празни клетки с ребро, теглото на което е 0. Стандартният алгоритъм на Дейкстра в получения граф решава задачата. За целта в началото и двата върха, съответни на началната клетка на тръбопровода се обявяват за “обходени” с дължина на най-късия път равна на 0. Алгоритъмът прекратява работата, когато “обходи” някои от върховете съответни на крайната клетка на тръбопровода. Препоръчително е да се използва оптимизираната версия на Дейкстра алгоритъма, използваща Fibonacci heap, която ще доведе до O(K*logK +L), където К е броят на върховете, а L - броят на ребрата в графа. Понеже L e O(K), то сложността ще е O(K*log K).Интересно е, че в случая може да използваме алгоритъма за обхождане в широчина, за да намерим най-късите пътища в графа. Първо построяваме графа по описания по-горе начин, при който на всяка клетка съпоставяме два върха на графа. За получения граф трябва да се приложи модифицирано обхождане в широчина. Понеже имаме и ребра с тегла 0, нужна е една малка промяна спрямо класическия алгоритъм - при достигането на даден v връх със сума l на теглата на ребрата от пътя (дължина l), трябва да обработим и всички върхове, до които се стига от него само чрез ребра с тегла 0. Тези върхове също ще бъдат достигнати с дължина l. Така, първата стъпка ще бъде да се обработят всички върхове, до които се стига с дължина 0; после всички върхове, до които се стига с дължина 1 и т.н. Щом достигнем някой от върховете съответни на крайната клетка на тръбопровода, ще сме намерили тръбопровод с възможно най-малко колена. Сложността на обхождането в широчина е O(K+L), където К е броят на върховете, а L - броят на ребрата в графа. Понеже L e O(K), то сложността ще е O(K).

    Анализи на решения изпратени от участници:

  • Камен Добрев


  • За въпроси можете да ни пишете на адрес: konkurs@musala.com.

    Supported by Musala Soft Ltd.

    Copyright 2000-2010 by Musala Soft Ltd. All rights reserved.