Bài toán duyệt đồ thị theo chiều sâu
Nhận xét : Các đỉnh có thứ tự thăm nằm trong khoảng từ $num[u]$ đến $tail[u]$ chính là các đỉnh nằm trong cây con gốc $u$ trong cây $DFS$. Show Cách tính mảng low[], num[], tail[] :
Ứng dụng cây DFS trong bài toán tìm khớp, cầuĐịnh nghĩa
Bài toán 1GRAPH_ - Tìm khớp và cầu (Cơ bản) Đề bàiXét đơn đồ thị vô hướng $G=(V, E)$ có $N$ $(1 \le N \le 10000)$ đỉnh và $M$ $(1 \le M \le 50000)$ cạnh. Người ta định nghĩa một đỉnh gọi là khớp nếu như xoá đỉnh đó sẽ làm tăng số thành phần liên thông của đồ thị. Tương tự như vậy, một cạnh được gọi là cầu nếu xoá cạnh đó sẽ làm tăng số thành phần liên thông của đồ thị. Vấn đề đặt ra là cần phải đếm tất cả các khớp và cầu của đồ thị $G$. Input
Output
Example Input
Output
Note
Phân tíchTìm cạnh cầu
Tìm đỉnh khớp
Cài đặtCấu trúc dữ liệu:
Đánh giá
Bài toán 2NKPOLICE - Police Đề bàiĐể truy bắt tội phạm, cảnh sát xây dựng một hệ thống máy tính mới. Bản đồ khu vực bao gồm $N$ thành phố và $M$ đường nối $2$ chiều. Các thành phố được đánh số từ $1$ đến $N$. Cảnh sát muốn bắt các tội phạm di chuyển từ thành phố này đến thành phố khác. Các điều tra viên, theo dõi bản đồ, phải xác định vị trí thiết lập trạm gác. Hệ thống máy tính mới phải trả lời được $2$ loại truy vấn sau:
Input
Dữ liệu được cho sao cho ban đầu luôn có cách di chuyển giữa hai thành phố bất kỳ. Output
Example Input
Output
Note Phân tích
Truy vấn 1
Truy vấn 2
Cài đặtCấu trúc dữ liệu:
Đánh giá
Bài toán 3KBUILD - Sửa cầu Đề bàiCho $N$ hòn đảo và $N - 1$ cây cầu, mỗi cây cầu nối hai hòn đảo lại với nhau. Đảm bảo rằng từ một đảo bất kì luôn có thể đến được hết mọi đảo còn lại. Pirate đưa ra một lịch trình như sau: vào mỗi ngày sẽ đi kiểm tra mọi cây cầu trên đường đi từ đảo $a$ đến đảo $b$. Hỏi sau khi Pirate thực hiện xong lịch trình đó, thì còn có bao nhiêu cây cầu chưa được kiểm tra? Input
$1 \le N, M \le 200000$ Output
Input
Output
Note
Phân tíchVì đồ thị ban đầu liên thông và có $N - 1$ cạnh nên đây là đồ thị dạng cây. Để đánh dấu các cạnh thuộc đường đi từ đỉnh $u$ đến đỉnh $v$ trên cây, thì ta có thể thêm một cạnh $(u,v)$ vào đồ thị. Khi đó, các cạnh thuộc đường đi từ $u \rightarrow v$ trên cây sẽ nằm trong $1$ chu trình. Từ đó, bài toán sẽ quy về thành bài toán đếm số lượng cạnh cầu của đồ thị.
Cài đặtCấu trúc dữ liệu:
include using namespace std;
const int maxN = 10010;
int n, m;
bool joint[maxN];
int timeDfs = 0, bridge = 0;
int low[maxN], num[maxN];
vector include using namespace std;
const int maxN = 2e5 + 10;
int n, m;
int timeDfs = 0, bridge = 0;
int low[maxN], num[maxN];
vector
4 Đánh giá
Bài toán 5KCOLLECT - Thu hoạch Đề bàiKhu vườn của Pirate có hình chữ nhật, và được chia thành $M \cdot N$ ô vuông bằng nhau. Trong mỗi ô vuông có một cây thuộc một loại quả khác nhau, đánh số từ $0$ đến $9$. Những con số này thể hiện giá trị kinh tế của các loại cây. Tuy nhiên, nhìn mặt con Robot trái cây này có vẻ ngu ngu nên trong lần đầu tiên thử việc, Pirate muốn test AI của nó. Cụ thể là Robot phải tuân theo các quy định sau:
Xuất phát từ ô ở góc tây bắc của khu vườn, hãy giúp Robot trái cây xác định hành trình để đạt được lợi nhuận tối đa. |