[Chưa hoàn thiện] [Đồ thị] [CHD] [Codefun] CHD5J
Đề bài
Cho số n (n<=1000000) và dãy a. Trông đồ thi đỉnh i được nối với đỉnh j khi a[i]<a[j] và i>j. Tìm số lượng thành phần liên thông và liệt kê các đỉnh theo thứ tự tăng dần theo số hiệu trong từng thành phần liên thông.
(đề bài hoàn chỉnh chưa có).
Hướng làm
Do n lớn nên độ phức tạp chấp nhận được là O(nlogn) trở xuống
Để dễ hiểu ta coi mỗi phần tử của mảng a là một đỉnh.
Gọi d[i] là vị trí của đỉnh mang giá trị i trong mảng a.
Xét các đỉnh theo thứ tự giảm dần theo giá trị, ta có các đỉnh đã xét luôn có giá trị cao hơn các đỉnh chưa xét.
Gọi p là vị trí mong muốn, số lượng thành phần liên thông là tplt, vị trí có số hiệu thấp nhất là m ban đầu đặt p = n, tplt = 0, m = n
Với i từ n xuống 1
Nếu d[i]=p thì
tăng tplt;
đánh dấu vị trí p;
p = m-1;
m = p;
không thì
nếu d[i]<m thì m=i
In tplt
Với i từ 1 đến n
Nếu p được đánh dấu thì in số lượng đỉnh trong thành phần liên thông tiếp theo
In p;
Thực tế ta còn phải dùng khá nhiều biến nữa để thực hiện yêu cầu đề bài.
Giải thích:
Các đỉnh nằm sau đỉnh có số hiệu thấp nhất mà chưa được xét luôn có số hiệu thấp hơn nên sẽ nối với đỉnh có số hiệu thấp nhất đó nên sẽ cùng thành phần liên thông với đỉnh đó.
Độ phức tạp: O(n).
Code C++