---
author: nguyencter
tags: Speed
title: Speed Solution
---
$\Huge\text{Speed Solution}$
-------
:::info
🔗 Links: [Đề bài](https://drive.google.com/file/d/1Avf1-ddrJhpUP830XoK4gzXm3gOvAB55/view?usp=sharing)
📌 Tags: `kruskal` `brute force`
✍️ Writer: nguyencter
📋 Content:
[TOC]
:::
-----
## Giới Thiệu Đề Bài
Một thành phố du lịch có $n$ địa điểm được kết nối với nhau bằng $m$ con đường hai chiều. Con đường thứ $k$ ($1≤ k ≤ m$) kết nối địa điểm $i_k$ với $j_k$ và cho các phương tiện đi với tốc độ đúng bằng $s_k$
Để khuyến khích khách du lịch đi lại an toàn trong thành phố, lãnh đạo thành phố muốn xác định giá trị $min_s$ và $max_s$ tương ứng là tốc độ tối thiểu và tốc độ tối đa để khi một phương tiện duy trì vận tốc trong đoạn từ $min_s$ đến $max_s$ thì có thể đi đến tất cả thành phố xuất phát từ một bất kì thành phố.
**Yêu cầu:** Tìm giá trị $min_s$ và $max_s$ thỏa mãn điều kiện $max_s-min_s$ đạt giá trị nhỏ nhất, nếu có nhiều bộ $min_s$ và $max_s$ thỏa mãn, cần tìm bộ mà $min_s$ nhỏ nhất.
-----
## Thuật toán
Vì số cạnh là $m ≤ 10000$ nên ta có thể duyệt qua từng cây khung để tìm kết quả tối ưu nhất.
Sắp xếp lại $m$ cạnh theo giá trị tăng dần của $s$.
Duyệt qua $m$ cạnh:
- Với mỗi cạnh ta lại tìm xem có thể tạo được cây khung chỉ với số cạnh từ $i$ đến $m$ hay không.
- Nếu có thì ta chỉ cần lưu lại kết quả tối ưu là $max_s-min_s$ có giá trị nhỏ nhất.
- Ngược lại thì thoát khỏi vòng lặp.
Độ phức tạp là $O(m^2)$.
----
Tham khảo code mẫu ở [đây](https://github.com/nguyencter/CODE/blob/main/speed.cpp).