Minimuux
28.12.2022 10:34

Накину за Школьник Федя подрабатывает по утрам почтальоном, разнося газеты местным жителям - в каждый дом по одной. А ещё Федя - очень прилежный ученик, так что не любит опаздывать в школу.

К сожалению, сегодня Федя проспал, так что он очень торопится добраться до школы, поэтому пойдёт по самому короткому возможному пути. Но по дороге он хочет разнести как можно больше газет - не оставлять же граждан без утреннего чтива Феде - найдите для него оптимальный маршрут с учётом его пожеланий.

Формат входных данных

В первой строке входных данных через пробел заданы два целых числа n - количество домов и m - количество дорог между домами (1 ≤ n, m ≤ 3 × 10^5).

Во второй строке входных данных через пробел заданы два целых числа s, t (1 ≤ s, t ≤ n, s ≤ t) - номер дома, в котором живёт Федя и дома, где находится его школа.

В последующих m строках через пробел заданы три целых числа a, b, c (1 ≤ a < b ≤ n, 1 ≤ c ≤ 10^9) - номера домов, соединённых дорогой, и длина дороги. Федя может перемещаться только по дорогам.

Гарантируется, что никакая пара чисел (a, b) не встречается во входных данных два раза.

Также гарантируется, что Федя может добраться от любого дома до любого другого по дорогам.

Формат результата

В ответ выведите три строки.

В первой строке выведите суммарную длину дорог на оптимальном пути Феди.

Во второй строке выведите количество газет, разнесённых Федей (себе домой и в школу Федя газеты не разносит).

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

Если существует несколько оптимальных маршрутов, вы можете вывести любой из них.

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
a4m4u4r4
15.11.2020 16:45
1) Решение методом рекурсии.
Программа проста в понимании, но неэффективна при больших значениях
var
  n: integer;
function f(i: integer): longint;
begin
  if i < 2 then
    f := 1
  else
    f := f(i - 1) + f(i - 2);
end;
begin
  read(n);
  writeln(f(n));
end.

2) Решение методом динамического программирования. Намного быстрее метода с рекурсией.
var
  i, n: integer;
  f: array[0..50] of longint;
begin
  read(n);
  f[0] := 1;
  f[1] := 1;
  for i := 2 to n do
    f[i] := f[i - 1] + f[i - 2];
  writeln(f[n]);
end.

3) Решение методом моделирования. Использует меньше памяти.
var
  n, a, b, i: integer;
begin
  read(n);
  if n < 2 then
    a := 1
  else
  begin
    a := 0;
    b := 1;
    for i := 0 to n do
    begin
      b := a + b;
      a := b - a;
    end;
  end;
  writeln(a);
end.
0,0(0 оценок)
Ответ:
mma0509
06.12.2020 18:38
// PascalABC.NET 3.0, сборка 1128
var
  i,j,k,n,p:longint;
  f:array[1..10,1..2] of longint;
begin
  p:=2; i:=1;
  f[1,1]:=1; f[1,2]:=1;
  Write('Введите натуральное число не больше 2 147 483 647: ');
  Read(n);
  while n<>1 do begin
    if (n mod p)=0 then begin
      if f[i,1]<>p then
      begin Inc(i); f[i,1]:=p; f[i,2]:=1 end
      else Inc(f[i,2]);
      n:=n div p
    end
    else inc(p)
  end;
  k:=i;
  for i:=2 to k do
    for j:=1 to f[i,2] do Write(f[i,1],' ');
  Writeln
end.

Тестовое решение:
Введите натуральное число не больше 2 147 483 647: 37534
2 7 7 383
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота