В некотором государстве имеется n городов, некоторые из которых соединены двусторонними дорогами. Города пронумерованы целыми числами от 1 до n. В период финансового кризиса уровень преступности в государстве поднялся и стали появляться организованные преступные группировки. Самой опасной из них стала "Тимур и его банда", возглавляемая небезызвестным в криминальных кругах Тимой, которая стала разбойничать на большинстве дорог. В результате по некоторым дорогам стало опасно ездить.
Бахе надо попасть из города 1 в город n. Так как он слишком ценит свою жизнь (и кошелек), он решил обмануть Тиму и поехать по наименее опасному маршруту, пусть даже он будет не самым коротким. Для каждой дороги он определил ее опасность, как целое число от 0 (безопасная) до 1000000 (очень опасная). Опасность маршрута - это максимум из опасностей дорог, составляющих маршрут.
Помогите ему выбрать самый безопасный маршрут (то есть тот, опасность которого минимально возможная).
Первая строка содержит два целых числа n и m (2 ≤ n, m ≤ 1000000). Каждая из следующих m строк определяет одну дорогу и содержит три целых числа:
a, b - города, соединенные дорогой (1 ≤ a, b ≤ 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;
}
Есть решение которого нет на сайте? Пиши admin@devexe.top