#include #include using namespace std; int wt(int i, int j) { // wt(i, j) возвращает вес ребра i -> j // В задаче вершины нумеруются с 1, а у нас в коде с 0, поэтому увеличиваем i и j на 1 i++; j++; return (179 * i + 719 * j) % 1000 - 500; // Возвращаем искомое значение по формуле из условия } const int INF = 1e9; void solve() { int n; cin >> n; // считываем кол-во вершин в графе vector d(n, INF); // d[i] = x означает, что вес кратчайшего пути от 0-ой вершины до i-ой равен x d[0] = 0; // Расстояние от 0-ой вершины до самой себя равно нулю while (true) { // Перебираем фазу до бесконечности bool did = false; // did = true, если на текущей фазе сделана хотя бы одна успешная релаксация for (int i = 0; i < n; ++i) { // Перебираем вершину, в которой заканчивается ребро for (int j = 0; j < i; ++j) { // Перебираем вершину, в которой начинается ребро int w = wt(j, i); // w - вес ребра j -> i if (d[i] > d[j] + w) { // Если расстояние до i-ой вершины больше, чем расстояние до j-ой + вес ребра, то можно успешно выполнить релаксацию d[i] = d[j] + w; // Обновляем кратчайшее расстояние до i-ой вершины did = true; // Делаем пометку об успешной релаксации } } } if (!did) { // Если ни одной релаксации выполнено не было, то все расстояния уже посчитаны, а значит можно выйти из цикла break; } } cout << d[n - 1]; // Выводим искомое значение } int main() { solve(); return 0; }