Nhảy chuyển đến

Trên cây dẫn dắt thức xác nhập

Dẫn vào

Dẫn dắt thức thuật toán là cái gì đâu?

Dẫn dắt thức thuật toán là căn cứ vào nhân loại kinh nghiệm cùng trực quan cảm giác, đối một ít thuật toán ưu hoá.

Cử cái ví dụ, nhất thường thấy chính là cũng tra tập dẫn dắt thức xác nhập, số hiệu là cái dạng này:

1
2
3
4
5
6
voidmerge(intx,inty){
intxx=find(x),yy=find(y);
if(size[xx]size[yy])swap(xx,yy);
fa[yy]=xx;
size[xx]+=size[yy];
}

Ở chỗ này, đối với hai cái lớn nhỏ không giống nhau tập hợp, chúng ta đem tiểu nhân tập hợp xác nhập đến đại tập hợp trung, mà không phải đem đại tập hợp xác nhập đến tiểu nhân tập hợp trung.

Vì cái gì đâu? Cái này tập hợp lớn nhỏ có thể cho rằng là tập hợp độ cao ( ở bình thường dưới tình huống ), mà chúng ta đem tập hợp độ cao tiểu nhân cũng đến độ cao đại hiển nhiên có trợ giúp chúng ta tìm được phụ thân.

Làm độ cao tiểu nhân thụ trở thành độ cao trọng đại thụ tử thụ, cái này ưu hoá có thể xưng là dẫn dắt thức xác nhập thuật toán.

Thuật toán nội dung

Trên cây dẫn dắt thức xác nhập ( dsu on tree ) đối với nào đó trên cây ly tuyến vấn đề có thể tốc độ lớn hơn hoặc bằng đại bộ phận thuật toán thả càng dễ dàng lý giải cùng thực hiện thuật toán.

Suy xét phía dưới vấn đề:Trên cây số nhan sắc.

Ví dụ mẫu dẫn vào

Cấp ra một câyCái tiết điểm lấyLàm gốc thụ, tiết điểmNhan sắc vì,Hiện tại đối với mỗi cái giao điểmDò hỏi lấyLàm gốc tử thụ tổng cộng xuất hiện nhiều ít loại bất đồng nhan sắc.

.

dsu-on-tree-1.png

Đối với loại này vấn đề giải quyết phương thức phần lớn là vận dụng đại lượng số liệu kết cấu ( thụ bộ thụ chờ ), nếu có thể ly tuyến, có phải hay không có càng đơn giản phương pháp?

Quá trình

Nếu duy trì ly tuyến, suy xét dự xử lý sauPhát ra đáp án.

Trực tiếp bạo lực dự xử lý thời gian phức tạp độ vì,Tức đối mỗi một cái tử tiết điểm tiến hành một lần biến lịch, mỗi lần biến lịch phức tạp độ hiển nhiên cùngCùng giai, cóCái tiết điểm, cố phức tạp độ vì.

Có thể phát hiện, mỗi cái tiết điểm đáp án từ này tử thụ cùng này bản thân được đến, suy xét lợi dụng cái này tính chất xử lý vấn đề.

Chúng ta có thể trước dự xử lý ra mỗi cái tiết điểm tử thụ lớn nhỏ cùng nó trọng nhi tử, trọng nhi tử cùng thụ liên mổ phân giống nhau, là có được tiết điểm nhiều nhất tử thụ nhi tử, cái này quá trình hiển nhiên có thểHoàn thành.

Chúng ta dùngTỏ vẻ nhan sắcXuất hiện số lần,Tỏ vẻ giao điểmĐáp án.

Biến lịch một cái tiết điểm,Chúng ta ấn dưới bước đi tiến hành biến lịch:

  1. Trước biến lịchNhẹ ( phi trọng ) nhi tử, cũng tính toán đáp án, nhưngKhông giữ lại biến lịch sau nó đốiSố tổ ảnh hưởng;
  2. Biến lịch nó trọng nhi tử,Giữ lại nó đốiSố tổ ảnh hưởng;
  3. Lại lần nữa biến lịchNhẹ nhi tử tử thụ giao điểm, gia nhập này đó giao điểm cống hiến, lấy được đếnĐáp án.

dsu-on-tree-2.png

Thượng đồ là một ví dụ.

Như vậy, đối với một cái tiết điểm, chúng ta biến lịch một lần hạt cơ bản thụ, hai lần phi hạt cơ bản thụ, hiển nhiên là nhất có lời.

Thông qua chấp hành cái này quá trình, chúng ta đạt được cái này tiết điểm sở hữu tử thụ đáp án.

Vì cái gì không hợp cũng bước đầu tiên cùng bước thứ ba đâu? Bởi vìSố tổ không thể lặp lại sử dụng, nếu không không gian sẽ quá lớn, yêu cầu ởKhông gian nội hoàn thành.

Hiển nhiên nếu một cái tiết điểmBị biến lịchThứ, tắc này trọng nhi tử sẽ bị biến lịchThứ, nhẹ nhi tử ( nếu có lời nói ) sẽ bị biến lịchThứ.

Chú ý trừ bỏ trọng nhi tử, mỗi lần biến lịch xongMuốn thanh linh.

Chứng minh

Chúng ta giống thụ liên mổ phân giống nhau định nghĩa trọng biên cùng nhẹ biên ( liền hướng trọng nhi tử làm trọng biên, còn lại vì nhẹ biên ). Về trọng nhi tử cùng trọng biên định nghĩa, có thể thấy hạ đồ, đối với một cây cóCái tiết điểm thụ:

Căn tiết điểm đến trên cây tùy ý tiết điểm nhẹ biên số không vượt quaĐiều. Chúng ta thiết căn đến nên tiết điểm cóĐiều nhẹ biên nên tiết điểm tử thụ lớn nhỏ vì,Hiển nhiên nhẹ biên liên tiếp tử tiết điểm tử thụ lớn nhỏ nhỏ hơn phụ thân một nửa ( nếu lớn hơn một nửa liền không phải nhẹ biên ), tắc,Hiển nhiên,Cho nên.

Lại bởi vì nếu một cái tiết điểm là này phụ thân trọng nhi tử, tắc nó tử thụ nhất định ở nó huynh đệ bên trong nhiều nhất, cho nên tùy ý tiết điểm đến căn đường nhỏ thượng sở hữu trọng biên liên tiếp phụ tiết điểm ở tính toán đáp án khi nhất định sẽ không biến lịch đến cái này tiết điểm, cho nên một cái tiết điểm bị biến lịch số lần tương đương nó đến căn tiết điểm đường nhỏ thượng nhẹ biên số( sở dĩ muốnLà bởi vì nó bản thân phải bị biến lịch đến ), cho nên một cái tiết điểm bị biến nhiều lần số,Tổng thời gian phức tạp độ tắc vì,Phát ra đáp án tiêu phí.

dsu-on-tree-3.png

Đồ trúng thầu thô tức làm trọng biên, trọng biên liền hướng tử tiết điểm làm trọng nhi tử

Thực hiện

Thực hiện
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include&LTbits/stdc++.h>
usingnamespacestd;

constintN=2e5+5;

intn;

// g[u]: Tồn trữ cùng u liền nhau giao điểm
vectorint>g[N];

// sz: Tử thụ lớn nhỏ
// big: Trọng nhi tử
// col: Giao điểm nhan sắc
// L[u]: Giao điểm u DFS tự
// R[u]: Giao điểm u tử thụ trung giao điểm DFS tự cực đại
// Node[i]: DFS tự vì i giao điểm
// ans: Tồn đáp án
// cnt[i]: Nhan sắc vì i giao điểm cái số
// totColor: Trước mắt xuất hiện quá nhan sắc cái số
intsz[N],big[N],col[N],L[N],R[N],Node[N],totdfn;
intans[N],cnt[N],totColor;

voidadd(intu){
if(cnt[col[u]]==0)++totColor;
cnt[col[u]]++;
}

voiddel(intu){
cnt[col[u]]--;
if(cnt[col[u]]==0)--totColor;
}

intgetAns(){returntotColor;}

voiddfs0(intu,intp){
L[u]=++totdfn;
Node[totdfn]=u;
sz[u]=1;
for(intv:g[u])
if(v!=p){
dfs0(v,u);
sz[u]+=sz[v];
if(!big[u]||sz[big[u]]sz[v])big[u]=v;
}
R[u]=totdfn;
}

voiddfs1(intu,intp,boolkeep){
// tính toán nhẹ nhi tử đáp án
for(intv:g[u])
if(v!=p&&v!=big[u]){
dfs1(v,u,false);
}
// tính toán trọng nhi tử đáp án cũng giữ lại tính toán trong quá trình số liệu ( dùng cho kế thừa )
if(big[u]){
dfs1(big[u],u,true);
}
for(intv:g[u])
if(v!=p&&v!=big[u]){
// tử thụ giao điểm DFS tự cấu thành một đoạn liên tục khu gian, có thể trực tiếp biến lịch
for(inti=L[v];iR[v];i++){
add(Node[i]);
}
}
add(u);
ans[u]=getAns();
if(keep==false){
for(inti=L[u];iR[u];i++){
del(Node[i]);
}
}
}

intmain(){
scanf("%d",&n);
for(inti=1;in;i++)scanf("%d",&col[i]);
for(inti=1;in;i++){
intu,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs0(1,0);
dfs1(1,0,false);
for(inti=1;in;i++)printf("%d%c",ans[i],"\n"[i==n]);
return0;
}

Vận dụng

  1. Nào đó ra đề mục nhân thiết trí chính giải là dsu on tree đề

    NhưCF741D.Cấp một thân cây, mỗi cái tiết điểm quyền giá trị là 'a' đến 'v' chữ cái, mỗi lần dò hỏi yêu cầu ở một cái tử thụ tìm một cái đường nhỏ, sử nên đường nhỏ bao hàm tự phù bài tự sau trở thành Hồi văn xuyến.

    Bởi vì là sắp hàng sau trở thành Hồi văn xuyến, cho nên một chữ phù xuất hiện hai lần tương đương với không xuất hiện, nói cách khác, con đường này thỏa mãnNhiều nhất có một chữ phù xuất hiện số lẻ thứ.

    Bình thường cách làm là đối mỗi một cái tiết điểm dfs, mỗi đến một cái tiết điểm liền mạnh mẽ cái cử sở hữu chữ cái tìm được cùng nó dị hoặc sau kết quả vì 1 cái số lớn hơn 1 đường nhỏ, lại lấy dài nhất giá trị, như vậy là,Có thể dùng dsu on tree ưu hoá đến.Về cụ thể cách làm, có thể tham khảo phía dưới mở rộng đọc.

  2. Có thể dùng dsu làm loạn đề

    Có thể thủy một ít thụ bộ thụ bộ phận phân ( không có sửa chữa thao tác ), hơn nữa dsu phức tạp độ trội hơn trên cây mạc đội.

Luyện tập đề

CF600E Lomsat gelral

Đề ý phiên dịch: Thụ tiết điểm có nhan sắc, một loại nhan sắc chiếm lĩnh một cái tử thụ, đương thả chỉ đương không có mặt khác nhan sắc ở cái này tử thụ trung xuất hiện đến so nó nhiều. Cầu chiếm lĩnh mỗi cái tử thụ sở hữu nhan sắc chi cùng.

UOJ284 vui sướng trò chơi gà

CF1709E XOR Tree

Tham khảo tư liệu / mở rộng đọc

CF741D tác giả giới thiệu dsu on tree

Vị này tác giả lời giải trong đề bài