Nhảy chuyển đến

Âu kéo đồ

Bổn giao diện đem giản yếu giới thiệu Âu kéo đồ khái niệm, thực hiện cùng ứng dụng.

Định nghĩa

  • Âu kéo về lộ:Thông qua đồ trung mỗi điều biên vừa lúc một lần đường về
  • Âu kéo thông lộ:Thông qua đồ trung mỗi điều biên vừa lúc một lần thông lộ
  • Âu kéo đồ:Có Âu kéo về lộ đồ
  • Nửa Âu kéo đồ:Có Âu kéo thông lộ nhưng không có Âu kéo về lộ đồ

Tính chất

Âu kéo đồ trung sở hữu đỉnh điểm số độ đều là số chẵn.

NếuLà Âu kéo đồ, tắc nó vì bao nhiêu cái hoàn cũng, thả mỗi điều biên bị bao hàm ở số lẻ cái hoàn nội.

Phân biệt pháp

  1. Vô hướng đồ là Âu kéo đồ đương thả chỉ đương:
    • Phi linh độ đỉnh điểm là liên thông
    • Đỉnh điểm số độ đều là số chẵn
  2. Vô hướng đồ là nửa Âu kéo đồ đương thả chỉ đương:
    • Phi linh độ đỉnh điểm là liên thông
    • Đúng lúc có 2 cái kỳ độ đỉnh điểm
  3. Có hướng đồ là Âu kéo đồ đương thả chỉ đương:
    • Phi linh độ đỉnh điểm là cường liên thông
    • Mỗi cái đỉnh điểm nhập độ cùng ra độ bằng nhau
  4. Có hướng đồ là nửa Âu kéo đồ đương thả chỉ đương:
    • Phi linh độ đỉnh điểm là nhược liên thông
    • Nhiều nhất một cái đỉnh điểm ra độ cùng nhập độ chi kém vì 1
    • Nhiều nhất một cái đỉnh điểm nhập độ cùng ra độ chi kém vì 1
    • Mặt khác đỉnh điểm nhập độ cùng ra độ bằng nhau

Cầu Âu kéo về lộ hoặc Âu kéo lộ

Fleury thuật toán

Cũng xưng tránh kiều pháp, là một cái thiên bạo lực thuật toán.

Thuật toán lưu trình vì mỗi lần lựa chọn tiếp theo điều biên thời điểm ưu tiên lựa chọn không phải kiều biên.

Một cái rộng khắp sử dụng nhưng là sai lầm thực hiện phương thức là trước Tarjan dự xử lý kiều biên, sau đó lại DFS tránh cho đi kiều. Nhưng là bởi vì đi đồ trong quá trình biên sẽ bị xóa đi, một ít phi kiều biên sẽ biến thành kiều biên dẫn tới sai lầm. Đơn giản nhất thực hiện phương pháp là mỗi lần xóa bỏ một cái biên lúc sau bạo lực chạy một lần Tarjan tìm kiều, thời gian phức tạp độ là.Phức tạp thực hiện phương pháp phải dùng đến động thái đồ chờ, thực dụng giá trị không cao.

Hierholzer thuật toán

Cũng xưng từng bước cắm vào đường về pháp.

Quá trình

Thuật toán lưu trình vì từ một cái đường về bắt đầu, mỗi lần nhậm lấy một cái trước mắt đường về trung điểm, đem này thay đổi vì một cái đơn giản đường về, lấy này tìm kiếm đến một cái Âu kéo về lộ. Nếu từ lộ bắt đầu nói, liền có thể tìm kiếm đến một cái Âu kéo lộ.

Thực hiện

Hierholzer thuật toán bạo lực thực hiện như sau:

Tính chất

Cái này thuật toán thời gian phức tạp độ ước vì.Trên thực tế còn có phức tạp độ càng thấp thực hiện phương pháp, chính là đem tìm về lộ DFS cùng Hierholzer thuật toán đệ quy xác nhập, biên tìm về ven đường sử dụng Hierholzer thuật toán.

Nếu yêu cầu phát ra từ điển tự nhỏ nhất Âu kéo lộ hoặc Âu kéo về lộ nói, bởi vì yêu cầu đem biên bài tự, thời gian phức tạp độ là( đếm hết bài tự hoặc là số đếm bài tự có thể ưu hoá đến). Nếu không cần bài tự, thời gian phức tạp độ là.

Ứng dụng

Có hướng Âu kéo đồ nhưng dùng cho máy tính dịch mã.

Thiết cóCái chữ cái, hy vọng cấu tạo một cái cóCái hình quạt mâm tròn, mỗi cái mâm tròn thượng phóng một chữ cái, khiến cho mâm tròn thượng mỗi liên tụcVị đối ứng trường vìKý hiệu xuyến. Chuyển động một vòng (Thứ ) sau được đến từCái chữ cái sinh ra chiều dài vìCái các không giống nhau ký hiệu xuyến.

Cấu tạo như sau có hướng Âu kéo đồ:

Thiết,Cấu tạo,Như sau:

Quy địnhTrung đỉnh điểm cùng biên liên hệ quan hệ như sau:

Đỉnh điểmDẫn raĐiều biên:.

BiênDẫn vào đỉnh điểm.

Như vậyLà liên thông, thả mỗi cái đỉnh điểm nhập độ tương đương ra độ ( bình quân với), cho nênLà có hướng Âu kéo đồ.

Nhậm cầuTrung một cái Âu kéo về lộ,LấyTrung các biên cuối cùng một chữ cái, ấn các biên ởTrung trình tự xếp thành hình tròn đặt ở mâm tròn thượng là được.

Ví dụ mẫu

Lạc cốc P2731 cưỡi ngựa tu hàng rào

Cấp định một trương có 500 cái đỉnh điểm vô hướng đồ, cầu này trương đồ một cái Âu kéo lộ hoặc Âu kéo về lộ. Nếu có bao nhiêu tổ giải, phát ra nhỏ nhất kia một tổ.

Ở chủ đề trung, Âu kéo lộ hoặc Âu kéo về lộ không cần trải qua sở hữu đỉnh điểm.

Biên số lượng m thỏa mãn.

Giải đề ý nghĩ

Dùng Fleury thuật toán giải quyết chủ đề thời điểm chỉ cần lại lòng tham liền hảo, nhưng là bởi vì phức tạp độ không đúng, cho nên muốn đổi dùng Hierholzer thuật toán.

Bảo tồn đáp án có thể sử dụngstd::stack&LTint>,Bởi vì nếu tìm không phải đường về nói cần thiết đem kia một bộ phận đặt ở cuối cùng.

Chú ý, không thể sử dụng sát nhau Ma trận tồn đồ, nếu không thời gian phức tạp độ sẽ thoái hóa vì.Bởi vì yêu cầu đem biên bài tự, kiến nghị sử dụng trước hướng tinh hoặc làstd::vectorTồn đồ. Thí dụ mẫu số hiệu sử dụngstd::vector.

Thí dụ mẫu số hiệu
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
#include&LTalgorithm>
#include&LTcstdio>
#include&LTstack>
#include&LTvector>
usingnamespacestd;

structedge{
intto;
boolexists;
intrevref;

booloperator(constedge&b)const{returntob.to;}
};

vectoredge>beg[505];
intcnt[505];

constintdn=500;
stackint>ans;

voidHierholzer(intx){// mấu chốt hàm số
for(int&i=cnt[x];i(int)beg[x].size();){
if(beg[x][i].exists){
edgee=beg[x][i];
beg[x][i].exists=0;
beg[e.to][e.revref].exists=0;
++i;
Hierholzer(e.to);
}else{
++i;
}
}
ans.push(x);
}

intdeg[505];
intreftop[505];

intmain(){
for(inti=1;idn;++i){
beg[i].reserve(1050);// vector dùng reserve tránh cho động thái phân phối không gian, nhanh hơn tốc độ
}

intm;
scanf("%d",&m);
for(inti=1;im;++i){
inta,b;
scanf("%d%d",&a,&b);
beg[a].push_back((edge){b,1,0});
beg[b].push_back((edge){a,1,0});
++deg[a];
++deg[b];
}

for(inti=1;idn;++i){
if(!beg[i].empty()){
sort(beg[i].begin(),beg[i].end());// vì muốn ấn từ điển tự lòng tham, cần thiết bài tự
}
}

for(inti=1;idn;++i){
for(intj=0;j(int)beg[i].size();++j){
beg[i][j].revref=reftop[beg[i][j].to]++;
}
}

intbv=0;
for(inti=1;idn;++i){
if(!deg[bv]&&deg[i]){
bv=i;
}elseif(!(deg[bv]&1)&&(deg[i]&1)){
bv=i;
}
}

Hierholzer(bv);

while(!ans.empty()){
printf("%d\n",ans.top());
ans.pop();
}
}

Bài tập