|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.05.2012, 18:57 | #1 |
Пользователь
Регистрация: 25.10.2011
Сообщений: 13
|
олимпиадная задача
Задача «Secret Pipes»
Фермер Джон хочет как можно дешевле организовать свою систему распределения воды, но он не хочет, чтобы его конкурент фермер Плуто мог предсказать маршруты, которые он выбирает. ФД знает, что такая задача обычно требует самого дешевого способа прокладки труб поэтому он решил использовать второй по стоимости способ. Дан список всех двунаправленных труб, которые могут соединять множество из W(3 <= W<= 2 ООО) станций с водой (каждая из которых может быть встроена в колодец). Ваша задача — найти второй из самых дешевых способов соединить насосные станции, используя не более чем Р(Р <= 20 ООО) труб с заданной стоимостью каждой трубы. Не должно быть трубы, соединяющей станцию саму с собой. Не должно быть двух труб, соединяющих дважды одну и ту же пару станций. Гарантируется, что есть только один самый дешевый способ распределить воду, и что существует, как минимум, два способа распределить воду. Все стоимости — положительные числа, помещающиеся в 16-битное целое. Водная станция идентифицируется своим номером — целым числом в диапазоне 1..W. Ввод: строка 1- два разделенных пробелом целых числа, W и Р; строки 2..Р + 1 — каждая строка описывает одну трубу и содержит 3 числа, разделенных пробелом, — номера станций начала и конца трубы, а также стоимость этой трубы. Пример ввода: 57 123 234 147 24 11 259 545 358 Вывод: Одна строка, содержащая целое число — вторая минимальная стоимость конструирования системы распределения воды. Пример вывода: 20 помогите найти ошибки в коде программы код программы: program z1; uses crt; procedure InputData; Begin assing(input.'secret.in');reset(inp ut); readln(N,P); for i:=1 to P do readln(B[i],E[i],R[i]); close(input); end; procedure Tree_1; begin Answer:=0;j:=0; for i:=1 to N do makeset(i); for i:=1 to P do if (Findset(B[i]<>FindSet(E[i])) then begin inc(j); Key[j]:=i; Uion(B[i],E[i]); end; end; procedure Tree_2; begin Answer:=0;j:=0; for i:=1 to N do Makeset(i); for i:=1 to P do if (FindSet(B[i])<>FindSet(E[i]))and (NotMasked[i]) tnen begin Answer:=Answer+R[i]; Union(B[i],E[i]) end; end; begin InputData; QuickSort(1,P); Tree_1; for i:=1 to P do NotMasked[i]:=true; CurAnswer:=maxint; for v:=1 to N-1 do begin NotMasked[key[v]]:=false; Tree_2; if Answer<CurAnswer then CurAnswer:=Answer; NotMasked[key[v]]:=true; end; assign(output.'secret.out');rewrite (output) writeln(CurAnswer); close(output); end. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Олимпиадная задача | Sanek_ntsk | Помощь студентам | 4 | 09.11.2011 23:03 |
олимпиадная задача | danzel1 | Общие вопросы C/C++ | 2 | 21.10.2011 15:15 |
Олимпиадная задача | Alexey_kor | Помощь студентам | 7 | 30.01.2011 02:22 |
Олимпиадная задача. | _-Re@l-_ | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 09.12.2010 20:53 |
Олимпиадная задача | Carbon | Общие вопросы C/C++ | 2 | 23.05.2007 22:07 |