Олимпиадный тренинг

Задача . DFS Order


Задача

Темы:

У Беси есть простой неориентированный граф с вершинами, помеченными \(1\dots N\) (\(2\le N\le 750\)). Она генерирует поиск в глубину графа вызывая функцию \(\texttt{dfs}(1)\), описанную следующим C++ кодом. Каждый список соседних вершин (\(\texttt{adj}[i]\) для всех \(1\le i\le N\)) может быть переставлен произвольно перед началом поиска в глубину, поэтому граф может иметь множество возможных DFS-порядков.

vector<bool> vis(N + 1);
vector<vector<int>> adj(N + 1);  // adjacency list
vector<int> dfs_order;

void dfs(int x) {
    if (vis[x]) return;
    vis[x] = true;
    dfs_order.push_back(x);
    for (int y : adj[x]) dfs(y);
}

Вам дано начальное состояние графа, а также стоимость изменения состояния каждого ребра. А именно, для каждой пары вершин \((i,j)\) удовлетворяющей \(1\le i<j\le N\), Вам дано целое число \(a_{i,j}\) (\(0<|a_{i,j}|\le 1000\)) такое, что

  • Если \(a_{i,j}>0\), ребро \((i,j)\) сейчас отсутствует в графе, оно может быть добавлено за стоимость \(a_{i,j}\).
  • Если \(a_{i,j}<0\), ребро \((i,j)\) сейчас в графе, оно может быть удалено за стоимость \(-a_{i,j}\).

Определите минимальную суммарную стоимость изменить граф так, чтобы \([1,2\dots,N]\) стало возможным DFS-обходом.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(N\).

Далее следует \(N-1\) строка. \(j-1\)-ая строка содержит \(a_{1,j}, a_{2,j}, \dots, a_{j-1,j}\) разделённые одиночными пробелами.

ФОРМАТ ВЫВОДА (на экран / stdout):

Минимальная стоимость изменить граф так, чтобы \([1,2,\dots, N]\) стал возможным DFS-обходом.


Примеры
Входные данныеВыходные данные
1 4
1
2 3
40 6 11
10

time 500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя