Опасный маршрут C++

В некотором государстве имеется n городов, некоторые из которых соединены двусторонними дорогами. Города пронумерованы целыми числами от 1 до n. В период финансового кризиса уровень преступности в государстве поднялся и стали появляться организованные преступные группировки. Самой опасной из них стала "Тимур и его банда", возглавляемая небезызвестным в криминальных кругах Тимой, которая стала разбойничать на большинстве дорог. В результате по некоторым дорогам стало опасно ездить.

Бахе надо попасть из города 1 в город n. Так как он слишком ценит свою жизнь (и кошелек), он решил обмануть Тиму и поехать по наименее опасному маршруту, пусть даже он будет не самым коротким. Для каждой дороги он определил ее опасность, как целое число от 0 (безопасная) до 1000000 (очень опасная). Опасность маршрута - это максимум из опасностей дорог, составляющих маршрут.

Помогите ему выбрать самый безопасный маршрут (то есть тот, опасность которого минимально возможная).

Входные данные

   Первая строка содержит два целых числа n и m (2 ≤ nm ≤ 1000000). Каждая из следующих m строк определяет одну дорогу и содержит три целых числа:

ab - города, соединенные дорогой (1 ≤ ab ≤ n);

c - опасность дороги (0 ≤ c ≤ 1000000).

Любые два города могут быть соединены несколькими дорогами. Числа в строках разделены пробелами.

Выходные данные

   Одно целое число - опасность самого безопасного маршрута.

 

#include <iostream>
#include <algorithm>

using namespace std;

#define MAX 850001
int mas[MAX];

struct Edge
{
    int x, y, danger;
} e[MAX];

//Функция Repr находит представителя множества, в котором находится n.
//При этом для избежания вердикта Time Limit используется эвристика :
//если представителем вершины x является n, то следует положить mas[x] = n.
int Repr(int n)
{
    if (n == mas[n]) return n;
    return mas[n] = Repr(mas[n]);
}

//Объединение множеств, содержащих элементы x и y.
int Union(int x, int y)
{
    int x1 = Repr(x), y1 = Repr(y);
    mas[x1] = y1;
    return x1 != y1;
}

//Функция сравнения ребер. Дороги сортируются по возрастанию их опасности.
int lt(Edge a, Edge b)
{
    return a.danger < b.danger;
}

int main() {
    //Читаем ребра графа в массив ребер e.
    int i, n, m;
    scanf("%d %d", &n, &m);
    for (i = 1; i <= n; i++) mas[i] = i;
    for (i = 0; i < m; i++) scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].danger);

    //Сортируем ребра по величине опасности.
    sort(e, e + m, lt);

    //Перебираем ребра, начиная с наименее опасного. Объединяем множества,
    //содержащие их вершины. Как только вершины 1 и n попадут в одно множество 
    //(Repr(1) станет равным Repr(n)), самый безопасный путь будет найден.
    //Его опасность будет равна опасности последнего обрабатываемого ребра, то есть e[i].danger.
    for (i = 0; i < m; i++)
    {
        Union(e[i].x, e[i].y);
        if (Repr(1) == Repr(n)) break;
    }
    printf("%d\n", e[i].danger);
    return 0;
}

Назад

Повышение продаж с помощью веб-форм Разложение числа на простые множители Как качественный контент способствует продвижению сайта Как выбрать хостинг Как писать SEO-тексты? Что такое SEO оптимизация сайта


Хостинг

Есть решение которого нет на сайте? Пиши admin@devexe.top