Nhảy chuyển đến

Lớn nhất lưu

Bổn giao diện chủ yếu giới thiệu lớn nhất lưu vấn đề tương quan thuật toán tri thức.

Tường thuật tóm lược

Internet lưu cơ bản khái niệm tham kiếnInternet lưu tóm tắt.

LệnhLà một cái có nguyên hối điểm internet, chúng ta hy vọng ởThượng chỉ định thích hợp lưu,Bằng đại hóa toàn bộ internet lưu lượng( tức), một vấn đề này bị gọi lớn nhất lưu vấn đề ( Maximum flow problem ).

Ford–Fulkerson tăng quảng

Ford–Fulkerson tăng quảng là tính toán lớn nhất lưu một loại thuật toán gọi chung là. Nên phương pháp vận dụng lòng tham tư tưởng, thông qua tìm kiếm tăng quảng lộ tới đổi mới cũng cầu giải lớn nhất lưu.

Tường thuật tóm lược

Cấp định internetCậpThượng lưu,Chúng ta làm như sau định nghĩa.

Đối với biên,Chúng ta đem này dung lượng cùng lưu lượng chi kém xưng là còn thừa dung lượng( Residual Capacity ), tức.

Chúng ta đemTrung sở hữu giao điểm cùng còn thừa dung lượng lớn hơnBiên cấu thành tử đồ xưng là tàn lượng internet( Residual Network ), tức,Trong đó.

Warning

Chính như chúng ta lập tức muốn nhắc tới, lưu lượng có thể là giá trị âm, bởi vậy,Biên có khả năng cũng không ởTrung. Dẫn vào tăng quảng khái niệm sau, bên dưới đem cụ thể giải thích điểm này.

Chúng ta đemThượng một cái từ nguyên điểmĐến hối điểmĐường nhỏ xưng là tăng quảng lộ ( Augmenting Path ). Đối với một cái tăng quảng lộ, chúng ta cho mỗi một cái biênĐều hơn nữa ngang nhau lưu lượng, lấy làm cả internet lưu lượng gia tăng, này một quá trình được xưng là tăng quảng ( Augment ). Bởi vậy, lớn nhất lưu cầu giải có thể bị coi là bao nhiêu thứ tăng quảng phân biệt được đến lưu chồng lên.

Ngoài ra, ở Ford–Fulkerson tăng quảng trong quá trình, đối với mỗi điều biên,Chúng ta đều tân kiến một cái ngược hướng biên.Chúng ta ước định,Này một tính chất có thể thông qua ở mỗi lần tăng quảng khi dẫn vào lui lưu thao tác tới bảo đảm, tứcGia tăng khiHẳn là giảm bớt ngang nhau lượng.

Tip

Ở lớn nhất lưu thuật toán số hiệu thực hiện trung, chúng ta thường thường yêu cầu duy trì nhanh chóng phỏng vấn ngược hướng biên thao tác. Ở sát nhau Ma trận trung, này một thao tác là trivial (). Nhưng chủ lưu thực hiện là càng thêm ưu tú liên thức trước hướng tinh. Trong đó, một cái thường dùng kỹ xảo là, chúng ta lệnh biên từ số chẵn ( thông thường vì) bắt đầu đánh số, cũng ở thêm biên khi luôn là ngay sau đó gia nhập này ngược hướng biên khiến cho chúng nó đánh số liền nhau. Bởi vậy, chúng ta có thể lệnh đánh số vìBiên cùng đánh số vìBiên trước sau bảo trì lẫn nhau vì ngược hướng biên quan hệ.

Lần đầu tiếp xúc này một phương pháp người đọc khả năng nhận thấy được một cái trái với trực giác tình hình —— ngược hướng biên lưu lượngCó thể là một cái giá trị âm. Trên thực tế chúng ta có thể chú ý tới, ở Ford–Fulkerson tăng quảng trong quá trình, chân chính có ý nghĩa chính là còn thừa dung lượng,MàGiá trị tuyệt đối là râu ria, chúng ta có thể đem ngược hướng biên lưu lượng giảm bớt coi là ngược hướng biên còn thừa dung lượngGia tăng —— này cũng cùng lui lưu ý nghĩa tương ăn khớp —— ngược hướng biên còn thừa dung lượng gia tăng ý nghĩa chúng ta kế tiếp khả năng thông qua đi ngược hướng biên tới cùng ban đầu chính hướng tăng quảng triệt tiêu, đại biểu một loại “Đổi ý” thao tác.

Dưới trường hợp có khả năng trợ giúp ngươi lý giải này một quá trình. Giả thiếtLà một cái đơn vị dung lượng internet, chúng ta suy xét dưới quá trình:

  • Thượng có bao nhiêu điều tăng quảng lộ, trong đó, chúng ta lựa chọn tiến hành một lần trước sau trải quaTăng quảng ( như tả đồ sở kỳ ), lưu lượng gia tăng.
  • Chúng ta chú ý tới, nếu tiến hành trung trên bản vẽ tăng quảng, cái này bộ phận lớn nhất lưu lượng không phảiMà là.Nhưng bởi vì chỉ hướngBiên cùng từXuất phát biên ở lần đầu tiên tăng quảng trung hao hết dung lượng, lúc này chúng ta vô pháp tiến hành trung trên bản vẽ tăng quảng. Này ý nghĩa chúng ta trước mặt lưu là không đủ ưu, nhưng bộ phận khả năng đã không có mặt khác ( chỉ trải qua nguyên đồ trung biên mà không trải qua ngược hướng biên ) tăng quảng lộ.
  • Hiện tại dẫn vào lui lưu thao tác. Lần đầu tiên tăng quảng sau, lui lưu ý nghĩaGia tăng rồiCòn thừa dung lượng, tức tương đương với tân tăngNày biên, bởi vậy chúng ta có thể lại tiến hành một lần trước sau trải quaTăng quảng ( như hữu đồ màu cam đường nhỏ sở kỳ ). Vô hướng biênThượng lưu lượng ở hai lần tăng quảng trung triệt tiêu, chúng ta ngạc nhiên phát hiện hai lần tăng quảng chồng lên được đến kết quả trên thực tế cùng trung đồ là đồng giá.

Trở lên trường hợp nói cho chúng ta biết, lui lưu thao tác mang đến “Triệt tiêu” hiệu quả khiến cho chúng ta đừng lo chúng ta dựa theo “Sai lầm” trình tự lựa chọn tăng quảng lộ.

Dễ dàng phát hiện, chỉ cầnThượng tồn tại tăng quảng lộ, như vậy đối này tăng quảng liền có thể lệnh tổng lưu lượng gia tăng; nếu không thuyết minh tổng lưu lượng đã đạt tới lớn nhất khả năng giá trị, cầu giải quá trình hoàn thành. Đây là Ford–Fulkerson tăng quảng quá trình.

Lớn nhất lưu nhỏ nhất cắt định lý

Chúng ta đại khái hiểu biết Ford–Fulkerson tăng quảng tư tưởng, chính là như thế nào chứng minh này một phương pháp chính xác tính đâu? Vì cái gì tăng quảng sau khi kết thúc lưuLà một cái lớn nhất lưu?

Trên thực tế, Ford–Fulkerson tăng quảng chính xác tính cùng lớn nhất lưu nhỏ nhất cắt định lý ( The Maxflow-Mincut Theorem ) đồng giá. Này nhất định lý chỉ ra, đối với tùy ý internet,Này thượng lớn nhất lưuCùng nhỏ nhất cắtLuôn là thỏa mãn.

Vì chứng minh lớn nhất lưu nhỏ nhất cắt định lý, chúng ta trước từ một cái dẫn lý xuất phát: Đối với internet,Nhậm lấy một cái lưuCùng một cái cắt,Luôn là có,Trong đó ngang bằng thành lập đương thả chỉ đươngSở hữu biên đều mãn lưu, thảSở hữu biên đều không lưu.

Chứng minh

Vì lấy chờ, cái thứ nhất dấu hiệu không công bằng yêu cầuSở hữu biên đều không lưu, cái thứ hai dấu hiệu không công bằng yêu cầuSở hữu biên đều mãn lưu. Nguyên dẫn lý đến chứng.

Như vậy, đối với tùy ý internet, trở lên lấy chờ điều kiện hay không luôn là có thể bị thỏa mãn đâu? Nếu đáp án là khẳng định, tắc lớn nhất lưu nhỏ nhất cắt định lý đến chứng. Dưới chúng ta nếm thử chứng minh.

Chứng minh

Giả thiết mỗ một vòng tăng quảng sau, chúng ta được đến lưuKhiến choThượng không tồn tại tăng quảng lộ, tứcThượng không tồn tạiĐếnĐường nhỏ. Lúc này chúng ta nhớ từXuất phát có thể tới giao điểm tạo thành điểm tập vì,Cũng nhớ.

Hiển nhiên,Một cái cắt, thả.Bởi vì còn thừa dung lượng thị phi phụ, này cũng ý nghĩa đối với tùy ý,Đều có.Dưới chúng ta đem này đó biên chia làm tồn tại với nguyên đồ trung biên cùng ngược hướng biên hai loại tình huống thảo luận:

  • :Lúc này,,Bởi vậy có,TứcSở hữu biên đều mãn lưu;
  • :Lúc này,,TứcSở hữu biên đều không lưu.

Bởi vậy, tăng quảng đình chỉ sau, kể trên lưuThỏa mãn lấy chờ điều kiện. Căn cứ dẫn lý chỉ ra lớn nhỏ quan hệ, tự nhiên mà,Một cái lớn nhất lưu,Một cái nhỏ nhất cắt.

Dễ dàng nhìn ra, Kőnig định lý là lớn nhất lưu nhỏ nhất cắt định lý đặc thù tình hình. Trên thực tế, chúng nó đều cùng quy hoạch tuyến tính trung đối ngẫu có quan hệ.

Thời gian phức tạp độ phân tích

Ở số nguyên lưu lượng internetThượng, bình phàm mà, chúng ta giả thiết mỗi lần tăng quảng lưu lượng đều là số nguyên, tắc Ford–Fulkerson tăng quảng thời gian phức tạp độ một cái thượng giới là,Trong đóThượng lớn nhất lưu. Đây là bởi vì đơn luân tăng quảng thời gian phức tạp độ là,Mà tăng quảng sẽ dẫn tới tổng lưu lượng gia tăng, cố tăng quảng luân số không có khả năng vượt qua.

Đối với Ford–Fulkerson tăng quảng bất đồng thực hiện, thời gian phức tạp độ cũng các không giống nhau. Trong đó so chủ lưu thực hiện có Edmonds–Karp, Dinic, SAP, ISAP chờ thuật toán, chúng ta đem tại hạ văn trung phân biệt giới thiệu.

Edmonds–Karp thuật toán

Thuật toán tư tưởng

Như thế nào ởTrung tìm kiếm tăng quảng lộ đâu? Khi chúng ta suy xét Ford–Fulkerson tăng quảng cụ thể thực hiện khi, nhất tự nhiên phương án chính là sử dụng BFS. Lúc này, Ford–Fulkerson tăng quảng biểu hiện vì Edmonds–Karp thuật toán. Này cụ thể lưu trình như sau:

  • Nếu ởThượng chúng ta có thể từXuất phát BFS đến,Tắc chúng ta tìm được rồi tân tăng quảng lộ.

  • Đối với tăng quảng lộ,Chúng ta tính toán raTrải qua biên còn thừa dung lượng nhỏ nhất giá trị.Chúng ta cấpThượng mỗi điều biên đều hơn nữaLưu lượng, cũng cho chúng nó ngược hướng biên đều lui rớtLưu lượng, lệnh lớn nhất lưu gia tăng rồi.

  • Bởi vì chúng ta sửa chữa lưu lượng, cho nên chúng ta được đến tân,Chúng ta ở tânThượng lặp lại kể trên quá trình, cho đến tăng quảng lộ không tồn tại, tắc lưu lượng không hề gia tăng.

Trở lên thuật toán tức Edmonds–Karp thuật toán.

Thời gian phức tạp độ phân tích

Kế tiếp làm chúng ta nếm thử phân tích Edmonds–Karp thuật toán thời gian phức tạp độ.

Hiển nhiên, đơn luân BFS tăng quảng thời gian phức tạp độ là.

Tăng quảng tổng luân số thượng giới là.Này một phán đoán suy luận ở internet tư liệu trung bình bị ngụy chứng ( hoặc bị lời nói hàm hồ lược quá ). Dưới chúng ta nếm thử cấp ra một cái so chính thức chứng minh1.

Tăng quảng tổng luân số thượng giới chứng minh

Đầu tiên, chúng ta dẫn vào một cái dẫn lý —— ngắn nhất lộ phi giảm dần dẫn lý. Cụ thể mà, chúng ta nhớThượng giao điểmĐến nguyên điểmKhoảng cách ( tức ngắn nhất lộ chiều dài, như trên ). Đối với mỗ một vòng tăng quảng, chúng ta dùngCùngPhân biệt tỏ vẻ tăng quảng trước lưu cùng tăng quảng sau lưu, chúng ta ngắt lời, đối với tùy ý giao điểm,Tăng quảng luôn là khiến cho.Chúng ta đem ở sau đó chứng minh này một dẫn lý.

Không ngại xưng tăng quảng trên đường còn thừa dung lượng nhỏ nhất biên là bão hòa biên ( tồn tại hơn biên đồng thời nhỏ nhất tắc lấy nhậm một ). Nếu một cái có hướng biênBị tuyển vì bão hòa biên, tăng quảng sẽ quét sạch này còn thừa dung lượng dẫn tới bão hòa biên biến mất, hơn nữa lui lưu dẫn tới ngược hướng biên tân tăng ( nếu ban đầu ngược hướng biên không tồn tại ), tứcThả.Trở lên phân tích sử chúng ta biết, đối với vô hướng biên,Này bị tăng quảng hai loại phương hướng luôn là luân phiên xuất hiện.

Thượng duyênTăng quảng khi,,Từ nay về sau tàn lượng internet biến thành.ỞThượng duyênTăng quảng khi,.Căn cứ ngắn nhất lộ phi giảm dần dẫn lý lại có,Chúng ta liên tiếp sở hữu tư thế, được đến.Nói cách khác, nếu có hướng biênBị tuyển vì bão hòa biên, như vậy cùng với thượng một lần bị tuyển vì bão hòa biên khi so sánh với,ĐếnKhoảng cách ít nhất gia tăng.

Đến tùy ý giao điểm khoảng cách không có khả năng vượt qua,Kết hợp kể trên tính chất, chúng ta phát hiện mỗi điều biên bị tuyển vì bão hòa biên số lần là,Cùng biên số tương thừa sau được đến tăng quảng tổng luân số thượng giới.

Kế tiếp chúng ta chứng minh ngắn nhất lộ phi giảm dần dẫn lý, tức.Này một chứng minh cũng không khó, nhưng khả năng hơi hiện vòng khẩu, người đọc có thể dừng lại nghiêm túc tự hỏi một lát.

Ngắn nhất lộ phi giảm dần dẫn lý chứng minh

Suy xét phản chứng. Đối với mỗ một vòng tăng quảng, chúng ta giả thiết tồn tại bao nhiêu giao điểm, chúng nó ở nên luân tăng quảng sau đếnKhoảng cách so tăng quảng trước giảm nhỏ. Chúng ta nhớVì trong đó đếnKhoảng cách nhỏ nhất một giả ( tức). Chú ý, căn cứ phản chứng giả thiết, lúc nàyLà đã biết điều kiện.

TrungĐếnNgắn nhất trên đường, chúng ta nhớThượng một cái giao điểm, tức.

Vì không choPhá hư“Khoảng cách nhỏ nhất” này một tính chất,Cần thiết thỏa mãn.

Đối với thượng thức, chúng ta lệnh dấu hiệu không công bằng hai sườn cùng thêm, đến.Căn cứ phản chứng giả thiết tiến hành phóng súc, chúng ta được đến.

Dưới chúng ta nếm thử thảo luậnThượng tăng quảng phương hướng.

  • Giả thiết có hướng biên.Căn cứ BFS “Chiều rộng ưu tiên” tính chất, chúng ta có.Nên thức cùng phóng súc kết quả xung đột, đạo ra mâu thuẫn.
  • Giả thiết có hướng biên.Căn cứĐịnh nghĩa chúng ta đã biết,Bởi vậy này biên tồn tại cần thiết là trước mặt theo trình tự tăng quảng trải quaCũng lui sinh non sinh ngược hướng biên kết quả, cũng tức.Nên thức cùng phóng súc kết quả xung đột, đạo ra mâu thuẫn.

Bởi vìDuyên bất luận cái gì phương hướng tăng quảng đều sẽ đạo ra mâu thuẫn, chúng ta biết phản chứng giả thiết không thành lập, ngắn nhất lộ phi giảm dần dẫn lý đến chứng.

Đem đơn luân BFS tăng quảng phức tạp độ cùng tăng quảng luân số thượng giới tương thừa, chúng ta được đến Edmonds–Karp thuật toán thời gian phức tạp độ là.

Số hiệu thực hiện

Edmonds–Karp thuật toán khả năng thực hiện như sau.

Tham khảo 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
constexprintMAXN=250;
constexprintINF=0x3f3f3f3f;

structEdge{
intfrom,to,cap,flow;

Edge(intu,intv,intc,intf):from(u),to(v),cap(c),flow(f){}
};

structEK{
intn,m;// n: Điểm số, m: Biên số
vectorEdge>edges;// edges: Sở hữu biên tập hợp
vectorint>G[MAXN];// G: Điểm x -> x sở hữu biên ở edges trung hạ tiêu
inta[MAXN],p[MAXN];// a: Điểm x -> BFS trong quá trình gần nhất tiếp cận điểm x biên cho nó lớn nhất lưu
// p: Điểm x -> BFS trong quá trình gần nhất tiếp cận điểm x biên

voidinit(intn){
for(inti=0;in;i++)G[i].clear();
edges.clear();
}

voidAddEdge(intfrom,intto,intcap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}

intMaxflow(ints,intt){
intflow=0;
for(;;){
memset(a,0,sizeof(a));
queueint>Q;
Q.push(s);
a[s]=INF;
while(!Q.empty()){
intx=Q.front();
Q.pop();
for(inti=0;iG[x].size();i++){// biến lịch lấy x làm khởi điểm biên
Edge&e=edges[G[x][i]];
if(!a[e.to]&&e.cap>e.flow){
p[e.to]=G[x][i];// G[x][i] là gần nhất tiếp cận điểm e.to biên
a[e.to]=
min(a[x],e.cap-e.flow);// gần nhất tiếp cận điểm e.to biên phú cho nó lưu
Q.push(e.to);
}
}
if(a[t])break;// nếu hối điểm tiếp thu tới rồi lưu, liền rời khỏi BFS
}
if(!a[t])
break;// nếu hối điểm không có tiếp thu đến lưu, thuyết minh nguyên điểm cùng hối điểm không ở cùng cái liên thông phân lượng thượng
for(intu=t;u!=s;
u=edges[p[u]].from){// thông qua u truy tìm BFS trong quá trình s -> t đường nhỏ
edges[p[u]].flow+=a[t];// gia tăng đường nhỏ bên trên flow giá trị
edges[p[u]^1].flow-=a[t];// giảm nhỏ ngược hướng đường nhỏ flow giá trị
}
flow+=a[t];
}
returnflow;
}
};

Dinic thuật toán

Thuật toán tư tưởng

Suy xét ở tăng quảng trước trước đốiLàm BFS phân tầng, tức căn cứ giao điểmĐến nguyên điểmKhoảng cáchĐem giao điểm phân thành bao nhiêu tầng. Lệnh trải quaLưu lượng chỉ có thể chảy về phía tiếp theo tầng giao điểm,Tức xóa bỏHướng tầng số cấp bằng nhau hoặc càng tiểu nhân giao điểm ra biên, chúng ta xưngDư lại bộ phận vì trình tự đồ ( Level Graph ). Hình thức hóa mà, chúng ta xưngTrình tự đồ, trong đó.

Nếu chúng ta ở trình tự đồThượng tìm được một cái lớn nhất tăng quảng lưu,Khiến cho chỉ ởThượng là không có khả năng tìm ra lớn hơn nữa tăng quảng lưu, tắc chúng ta xưngTắc lưu ( Blocking Flow ).

Warning

Cứ việc ở câu trên trung chúng ta chỉ ở tranh đơn tăng quảng trên đường định nghĩa tăng quảng / tăng quảng lưu, nghĩa rộng mà, “Tăng quảng” một từ không những có thể dùng cho tranh đơn đường nhỏ thượng tăng quảng lưu, cũng có thể dùng cho bao nhiêu tăng quảng lưu cũng —— người sau mới là chúng ta định nghĩa tắc lưu khi sử dụng ý nghĩa.

Định nghĩa trình tự đồ cùng tắc lưu sau, Dinic thuật toán lưu trình như sau.

  1. Thượng BFS ra trình tự đồ.
  2. Thượng DFS ra tắc lưu.
  3. ĐemCũng đến ban đầu lưuTrung, tức.
  4. Lặp lại trở lên quá trình thẳng đến không tồn tại từĐếnĐường nhỏ.

Lúc nàyTức vì lớn nhất lưu.

Ở phân tích này tính toán pháp phức tạp độ phía trước, chúng ta yêu cầu đặc biệt thuyết minh “ỞThượng DFS ra tắc lưu”Quá trình. Cứ việc BFS trình tự đồ đối với bổn giao diện người đọc hẳn là trivial, nhưng DFS tắc lưu quá trình tắc hơi cần kỹ xảo —— chúng ta yêu cầu dẫn vào trước mặt hình cung ưu hoá.

Chú ý tới ởThượng DFS trong quá trình, nếu giao điểmĐồng thời có đại lượng nhập biên cùng ra biên, hơn nữaMỗi lần tiếp thu đến từ nhập biên lưu lượng khi đều biến lịch ra biên biểu tới quyết định đem lưu lượng truyền lại cấp nào điều ra biên, tắcCái này bộ phận thời gian phức tạp độ nhất hư có thể đạt tới.Vì tránh cho này một khuyết tật, nếu mỗ nhất thời khắc chúng ta đã biết biênĐã tăng quảng đến cực hạn ( biênĐã mất còn thừa dung lượng hoặcSau sườn đã tăng quảng đến tắc ), tắcLưu lượng không cần phải lại nếm thử chảy về phía ra biên.Dưới đây, đối với mỗi cái giao điểm,Chúng ta giữ gìnRa biên biểu trung điều thứ nhất còn cần thiết nếm thử ra biên. Thói quen thượng, chúng ta xưng giữ gìn cái này kim đồng hồ vì trước mặt hình cung, xưng cái này cách làm vì trước mặt hình cung ưu hoá.

Nhiều lộ tăng quảng

Nhiều lộ tăng quảng là Dinic thuật toán một cái hằng số ưu hoá —— nếu chúng ta ở trình tự trên bản vẽ tìm được rồi một cái từĐếnTăng quảng lộ,Tắc kế tiếp chúng ta chưa chắc yêu cầu một lần nữa từXuất phát tìm tiếp theo điều tăng quảng lộ, mà khả năng từThượng cuối cùng một cái vẫn có còn thừa dung lượng vị trí xuất phát tìm kiếm một cái lối rẽ tiến hành tăng quảng. Suy xét đến này cùng hồi tưởng hình thức nhất trí tính, này một ưu hoá ở DFS số hiệu thực hiện trung cũng là tự nhiên.

Thường thấy lầm khu

Có thể là bởi vì đại lượng internet tư liệu sai lầm thuyết minh dẫn phát nghe nhầm đồn bậy tình hình, tương đương số lượng tuyển thủ thích đem trước mặt hình cung ưu hoá cùng nhiều lộ tăng quảng song song xưng là Dinic thuật toán hai loại ưu hoá. Trên thực tế, trước mặt hình cung ưu hoá là dùng cho bảo đảm Dinic thời gian phức tạp độ chính xác tính một bộ phận, mà nhiều lộ tăng quảng chỉ là một cái không ảnh hưởng phức tạp độ hằng số ưu hoá.

Thời gian phức tạp độ phân tích

Ứng dụng trước mặt hình cung ưu hoá sau, đối Dinic thuật toán thời gian phức tạp độ phân tích như sau.

Đầu tiên, chúng ta nếm thử chứng minh đơn luân tăng quảng trung DFS cầu tắc lưu thời gian phức tạp độ là.

Đơn luân tăng quảng thời gian phức tạp độ chứng minh

Suy xét tắc lưuTrung mỗi điều tăng quảng lộ, chúng nó đều là ởThượng mỗi lần duyên trước mặt hình cung nhảy ngược lại được đến kết quả, trong đó mỗi điều tăng quảng trên đường đi qua lịch nhảy chuyển số lần không có khả năng nhiều hơn.

Mỗi tìm được một cái tăng quảng lộ liền có một cái bão hòa biên biến mất ( còn thừa dung lượng thanh linh ). Suy xét tắc lưuTrung mỗi điều tăng quảng lộ, chúng ta đem bị chúng nó thanh linh bão hòa biên hình thành biên tập nhớ làm.Suy xét đếnPhân tầng tính chất, bão hòa biên sau khi biến mất này ngược hướng biên không có khả năng ở cùng luân tăng quảng nội bị mặt khác tăng quảng trên đường đi qua quá, bởi vậy,Tử tập.

Ngoài ra, đối với duyên trước mặt hình cung nhảy chuyển nhưng bởi vì nào đó vị trí tắc cho nên không có thành công được đến tăng quảng lộ tình hình, chúng ta đem này đó không hoàn chỉnh đường nhỏ thượng cuối cùng một cái biên hình thành biên tập nhớ làm.Thành viên không bão hòa, cho nênCùngKhông giao, thảVẫn làTử tập.

Bởi vìMỗi cái thành viên đều không có tiêu phí vượt quaThứ nhảy chuyển ( thả ở sử dụng nhiều lộ tăng quảng ưu hoá sau một ít nhảy chuyển đem bị lặp lại đếm hết ), bởi vậy, tổng thượng sở thuật, DFS trong quá trình tổng nhảy chuyển số lần không có khả năng nhiều hơn.

Thường thấy ngụy chứng thứ nhất

Đối với mỗi cái giao điểm, chúng ta giữ gìn tiếp theo điều có thể tăng quảng biên, mà trước mặt hình cung nhiều nhất biến hóaThứ, do đó đơn luân tăng quảng nhất hư thời gian phức tạp độ vì.

Bug

“Trước mặt hình cung nhiều nhất biến hóaThứ” cũng không thể đẩy đến “Mỗi cái giao điểm nhiều nhất phỏng vấn này ra biênThứ”. Đây là bởi vì, phỏng vấn trước mặt hình cung cũng không nhất định hao hết mặt trên còn thừa dung lượng, giao điểmKhả năng nhiều lần phỏng vấn cùng điều trước mặt hình cung.

Chú ý tới trình tự đồ tầng số hiển nhiên không có khả năng vượt qua,Nếu chúng ta có thể chứng minh trình tự đồ tầng số ở tăng quảng trong quá trình nghiêm khắc đơn tăng, tắc Dinic thuật toán tăng quảng luân số là.Kế tiếp chúng ta nếm thử chứng minh này một kết luận2.

Trình tự đồ tầng số đơn điệu tính chứng minh

Chúng ta yêu cầu dẫn vào dự lưu đẩy mạnh loại thuật toán ( một khác loại lớn nhất lưu thuật toán ) trung một cái khái niệm —— độ cao cấp. Vì càng phương tiện mà kết hợp độ cao cấp thuyết minh chúng ta chứng minh, ở chứng minh trong quá trình, chúng ta lệnhThượng giao điểmĐếnHối điểmKhoảng cách, từHối điểmMà phi nguyên điểm xuất phát tiến hành phân tầng ( này cũng không có bản chất khác nhau ). Đối với mỗ một vòng tăng quảng, chúng ta dùngCùngPhân biệt tỏ vẻ tăng quảng trước lưu cùng tăng quảng sau lưu. Ở nên luân tăng quảng trung cầu giải cũng gia nhập tắc lưu sau, nhớ trình tự đồ từBiến thành.

Chúng ta cấp độ cao cấp một cái không nghiêm khắc lâm thời định nghĩa —— ở internetThượng, lệnhLà điểm tậpĐến số nguyên tậpThượng hàm số,Thượng hợp pháp độ cao cấp đương thả chỉ đươngĐối vớiHằng thành lập.

Khảo sát sở hữuThành viên,Chúng ta phát hiệnNguyên nhân là dưới một trong hai.

  • ,Thả còn thừa dung lượng ở nên luân tăng quảng trong quá trình chưa hao hết —— căn cứ ngắn nhất lộ định nghĩa, lúc này chúng ta có;
  • ,Nhưng ở nên luân tăng quảng trong quá trình tắc lưu trải quaCũng lui sinh non sinh ngược hướng biên —— căn cứ trình tự đồ cùng tắc lưu định nghĩa, lúc này chúng ta có.

Trở lên quan sát làm chúng ta đến ra một cái kết luận ——Thượng là một cái hợp pháp độ cao cấp. Đương nhiên, ởTử đồThượng cũng là.

Hiện tại, đối với một cáiThượng tăng quảng lộ,Dựa theoThượng giao điểm phản tự ( từĐếnTrình tự ) suy xét từ không đường nhỏ bắt đầu mỗi lần tăng thêm một cái giao điểm quá trình. Giả thiết giao điểmĐã gia nhập, giao điểmĐang ở gia nhập, chúng ta phát hiện, gia nhập giao điểmSau, căn cứ trình tự đồ định nghĩa,Giá trị soGia tăng;Cùng lúc đó, bởi vìThượng độ cao cấp,Giá trị đã khả năng soGia tăng,Cũng có thể bảo trì bất biến hoặc giảm bớt. Bởi vậy, ở toàn bộ đường nhỏ bị tăng thêm hoàn thành sau, chúng ta được đến,Trong đó lấy chờ sung muốn điều kiện làĐối vớiHằng thành lập. Nếu nên bất đẳng thức không thể lấy chờ, tắc có—— tức chúng ta muốn kết luận “Trình tự đồ tầng số ở tăng quảng trong quá trình nghiêm khắc đơn tăng”. Dưới chúng ta nếm thử chứng minh nên bất đẳng thức không thể lấy chờ.

Suy xét phản chứng, chúng ta giả thiếtThành lập, cũng nếm thử đạo ra mâu thuẫn. Hiện tại chúng ta ngắt lời, ởThượng,Ít nhất bao hàm một cái biênThỏa mãnThượng không tồn tại. Nếu không có như vậy biên, suy xét đến,Kết hợp trình tự đồ cùng tắc lưu định nghĩa,Thượng tăng quảng ứng chưa hoàn thành. Vì không sinh ra trở lên mâu thuẫn, chúng ta ngắt lời đành phải là chính xác.

LệnhLà thỏa mãn ngắt lời điều kiện cái kia biên, này thỏa mãn ngắt lời nguyên nhân chỉ có thể này đây hạ một trong hai.

  • NhưngChưa lấy chờ, cố căn cứ trình tự đồ định nghĩa cũng biết,Cũng ở tăng quảng sau tân một vòng trọng phân tầng trung bị gia nhập đếnTrung;
  • ,Này ý nghĩaNày biên sinh ra là trước mặt theo trình tự tăng quảng trung tắc lưu trải quaCũng lui sinh non sinh ngược hướng biên kết quả, cũng tức.

Bởi vì chúng ta vô luận lấy loại nào phương thức thỏa mãn ngắt lời đều được đến,Cũng tứcLấy chờ sung muốn điều kiện vô pháp bị thỏa mãn, này cùng phản chứng giả thiếtXung đột, nguyên mệnh đề đến chứng.

Thường thấy ngụy chứng một khác tắc

Suy xét phản chứng. Giả thiết trình tự đồ tầng số ở một vòng tăng quảng sau khi kết thúc so ban đầu bằng nhau, tắc trình tự trên bản vẽ ứng vẫn tồn tại ít nhất một cái từĐếnTăng quảng lộ thỏa mãn liền nhau hai điểm gian tầng số kém vì.Này tăng quảng lộ chưa bị tăng quảng thuyết minh nên luân tăng quảng chưa kết thúc. Vì không sinh ra kể trên mâu thuẫn, nguyên mệnh đề thành lập.

Bug

“Một vòng tăng quảng sau khi kết thúc tân trình tự trên bản vẽ-Ngắn nhất lộ so ban đầu bằng nhau” cũng không thể đẩy đến “Cũ trình tự trên bản vẽ nên luân tăng quảng chưa kết thúc”. Đây là bởi vì, không có lý do gì cho thấy hai trương trình tự đồ biên tập tương đồng, tân trình tự trên bản vẽ-Ngắn nhất lộ có khả năng trải qua cũ trình tự trên bản vẽ không tồn tại biên.

Đem đơn luân tăng quảng thời gian phức tạp độCùng tăng quảng luân sốTương thừa, Dinic thuật toán thời gian phức tạp độ là.

Nếu yêu cầu lệnh Dinic thuật toán thực tế vận hành thời gian tiếp cận này lý luận thượng giới, chúng ta yêu cầu cấu tạo có đặc thù tính chất internet làm đưa vào. Bởi vì ở thuật toán thi đua thực tiễn trung, đối với internet lưu tri thức tương quan khảo sát thường trọng điểm với đem nguyên vấn đề kiến mô vì internet lưu vấn đề kỹ xảo. Lúc này, chúng ta kiến mô thông thường không bao hàm lệnh Dinic thuật toán chấp hành thong thả đặc thù tính chất; hoàn toàn tương phản, Dinic thuật toán ở đại bộ phận trên bản vẽ hiệu suất phi thường ưu tú. Bởi vậy, internet lưu vấn đề số liệu phạm vi thông thường trọng đại, “ĐemGiá trị đại nhậpLấy phỏng chừng vận hành thời gian” này một phương thức cũng không áp dụng. Trên thực tế, tiến hành chuẩn xác phỏng chừng yêu cầu tuyển thủ đối Dinic thuật toán thực tế hiệu suất có nhất định kinh nghiệm, người đọc có thể nhiều hơn luyện tập.

Đặc thù tình hình hạ thời gian phức tạp độ phân tích

Ở một ít tính chất tốt đẹp trên bản vẽ, Dinic thuật toán có càng tốt thời gian phức tạp độ.

Đối với internet,Nếu này sở hữu biên dung lượng đều vì,TứcĐối vớiHằng thành lập, tắc chúng ta xưngLà đơn vị dung lượng ( Unit Capacity ).

Ở đơn vị dung lượng internet trung, Dinic thuật toán đơn luân tăng quảng thời gian phức tạp độ vì.

Chứng minh

Đây là bởi vì, mỗi lần tăng quảng đều sẽ dẫn tới tăng quảng trên đường sở hữu biên đều bão hòa cũng biến mất, cố đơn luân tăng quảng trung mỗi điều biên chỉ có thể bị tăng quảng một lần.

Ở đơn vị dung lượng internet trung, Dinic thuật toán tăng quảng luân số là.

Chứng minh

Lấy nguyên điểmVì trung tâm phân tầng, nhớThượng giao điểmĐến nguyên điểmKhoảng cách. Mặt khác, chúng ta định nghĩa đem điểm tậpĐịnh nghĩa vì đánh số vìTrình tự,Cũng nhớ.

Giả thiết chúng ta đã tiến hành rồiLuân tăng quảng. Căn cứ bồ câu sào nguyên lý, ít nhất tồn tại một cáiThỏa mãn biên tậpLớn nhỏ không vượt qua.Hiển nhiên,Thượng-Cắt, thả này cắt dung lượng không vượt qua.Căn cứ lớn nhất lưu nhỏ nhất cắt định lý,Thượng lớn nhất lưu không vượt qua,Cũng tứcThượng nhiều nhất còn có thể chấp hànhLuân tăng quảng. Bởi vậy, tổng tăng quảng luân số là.

Ở đơn vị dung lượng internet trung, Dinic thuật toán tăng quảng luân số là.

Chứng minh

Giả thiết chúng ta đã tiến hành rồiLuân tăng quảng. Bởi vì nhiều nhất có một nửa (Cái ) trình tự bao hàm nhiều hơnCái điểm, cố vô luận chúng ta như thế nào phân phối sở hữu trình tự lớn nhỏ, ít nhất tồn tại một cáiThỏa mãn liền nhau hai cái trình tự đồng thời bao hàm không nhiều lắm vớiCái điểm, tứcThả.

Vì lớn nhất hóaCùngChi gian biên số, chúng ta giả định đây là một cái hoàn toàn nhị phân đồ, lúc này biên tậpLớn nhỏ không vượt qua.Hiển nhiên,Thượng-Cắt, thả này cắt dung lượng không vượt qua.Căn cứ lớn nhất lưu nhỏ nhất cắt định lý,Thượng lớn nhất lưu không vượt qua,Cũng tứcThượng nhiều nhất còn có thể chấp hànhLuân tăng quảng. Bởi vậy, tổng tăng quảng luân số là.

Ở đơn vị dung lượng internet trung, nếu trừ nguyên hối điểm ngoại mỗi cái giao điểmĐều thỏa mãnHoặc,Tắc Dinic thuật toán tăng quảng luân số là.Trong đó,CùngPhân biệt đại biểu giao điểmNhập độ cùng ra độ.

Chứng minh

Chúng ta dẫn vào dưới dẫn lý —— đối với này một hình thức internet, này thượng tùy ý lưu luôn là có thể phân giải thành bao nhiêu điều đơn vị lưu lượng,Điểm không giaoTăng quảng lộ.

Giả thiết chúng ta đã tiến hành rồiLuân tăng quảng. Căn cứ trình tự đồ định nghĩa, lúc này tùy ý tân tăng quảng lộ chiều dài ít nhất vì.

Suy xétThượng lớn nhất lưu tăng quảng lộ phân giải, chúng ta được đến tăng quảng lộ số lượng không thể nhiều hơn,Này ý nghĩaThượng nhiều nhất còn có thể chấp hànhLuân tăng quảng. Bởi vậy, tổng tăng quảng luân số là.

Tổng thượng, chúng ta đến ra một ít suy luận.

  • Ở đơn vị dung lượng trên mạng, Dinic thuật toán tổng thời gian phức tạp độ là.
  • Ở đơn vị dung lượng trên mạng, nếu trừ nguyên hối điểm ngoại mỗi cái giao điểmĐều thỏa mãnHoặc,Dinic thuật toán tổng thời gian phức tạp độ là.Đối với nhị phân đồ lớn nhất xứng đôi vấn đề, chúng ta thường sử dụng Hopcroft–Karp thuật toán giải quyết, mà này tính toán pháp trên thực tế là Dinic thuật toán ở thỏa mãn kể trên số độ hạn chế đơn vị dung lượng trên mạng trường hợp đặc biệt.

Số hiệu thực hiện

Tham khảo 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
structMF{
structedge{
intv,nxt,cap,flow;
}e[N];

intfir[N],cnt=0;

intn,S,T;
llmaxflow=0;
intdep[N],cur[N];

voidinit(){
memset(fir,-1,sizeoffir);
cnt=0;
}

voidaddedge(intu,intv,intw){
e[cnt]={v,fir[u],w,0};
fir[u]=cnt++;
e[cnt]={u,fir[v],0,0};
fir[v]=cnt++;
}

boolbfs(){
queueint>q;
memset(dep,0,sizeof(int)*(n+1));

dep[S]=1;
q.push(S);
while(q.size()){
intu=q.front();
q.pop();
for(inti=fir[u];~i;i=e[i].nxt){
intv=e[i].v;
if((!dep[v])&&(e[i].cap>e[i].flow)){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
returndep[T];
}

intdfs(intu,intflow){
if((u==T)||(!flow))returnflow;

intret=0;
for(int&i=cur[u];~i;i=e[i].nxt){
intv=e[i].v,d;
if((dep[v]==dep[u]+1)&&
(d=dfs(v,min(flow-ret,e[i].cap-e[i].flow)))){
ret+=d;
e[i].flow+=d;
e[i^1].flow-=d;
if(ret==flow)returnret;
}
}
returnret;
}

voiddinic(){
while(bfs()){
memcpy(cur,fir,sizeof(int)*(n+1));
maxflow+=dfs(S,INF);
}
}
}mf;

MPM thuật toán

MPM(Malhotra, Pramodh-Kumar and Maheshwari) thuật toán được đến lớn nhất lưu phương thức có hai loại: Sử dụng căn cứ vào đôi ưu tiên đội ngũ, thời gian phức tạp độ vì;Thường dùng BFS giải pháp, thời gian phức tạp độ vì.Chú ý, tấu chương tiết chỉ chuyên chú với phân tích càng ưu cũng càng ngắn gọnThuật toán.

MPM thuật toán chỉnh thể kết cấu cùng Dinic thuật toán cùng loại, cũng là phân giai đoạn vận hành. Ở mỗi cái giai đoạn, ởTàn lượng internet phân tầng internet trung tìm được tăng quảng lộ. Nó cùng Dinic thuật toán chủ yếu khác nhau ở chỗ tìm kiếm tăng quảng lộ phương thức bất đồng: MPM thuật toán trung tìm kiếm tăng quảng lộ bộ phận chỉ tốn,Thời gian phức tạp độ muốn trội hơn Dinic thuật toán.

MPM thuật toán yêu cầu suy xét đỉnh điểm mà không phải biên dung lượng. Ở phân tầng internetTrung, nếu định nghĩa điểmDung lượngVì này truyền vào tàn lượng cùng truyền ra tàn lượng nhỏ nhất giá trị, tắc có:

Chúng ta xưng tiết điểmLà tham khảo tiết điểm đương thả chỉ đương.Đối với một cái tham khảo tiết điểm,Chúng ta nhất định có thể cho trải quaLưu lượng gia tăngLấy làm này dung lượng biến thành.Đây là bởi vìLà có hướng vô hoàn đồ thảTrung tiết điểm dung lượng ít nhất vì,Cho nên chúng ta nhất định có thể tìm được một cái từTrải quaTớiCó hướng đường nhỏ. Như vậy chúng ta làm con đường này thượng biên lưu lượng đều gia tăngLà được. Con đường này tức vì này nhất giai đoạn tăng quảng lộ. Tìm kiếm tăng quảng lộ có thể dùng BFS. Tăng quảng xong lúc sau sở hữu mãn lưu biên đều có thể từTrung xóa bỏ, bởi vì chúng nó sẽ không tại đây giai đoạn sau bị sử dụng. Đồng dạng, sở hữu cùngCùngBất đồng thả không có ra biên hoặc nhập biên tiết điểm đều có thể xóa bỏ.

Thời gian phức tạp độ phân tích

MPM thuật toán mỗi cái giai đoạn đều yêu cầu,Bởi vì nhiều nhất cóThứ thay đổi ( bởi vì ít nhất xóa bỏ sở tuyển tham khảo tiết điểm ), hơn nữa ở mỗi lần thay đổi trung, chúng ta xóa bỏ trừ nhiều nhấtỞ ngoài trải qua sở hữu biên. Cầu hòa, chúng ta được đến.Bởi vì giai đoạn tổng số thiếu với,Bởi vậy MPM thuật toán tổng vận hành thời gian vì.

Giai đoạn tổng số nhỏ hơn V chứng minh

MPM thuật toán ở thiếu vớiCái giai đoạn nội kết thúc. Vì chứng minh điểm này, chúng ta cần thiết đầu tiên chứng minh hai cái dẫn lý.

Dẫn lý 1:Mỗi lần thay đổi sau, từĐến mỗi cái điểm khoảng cách sẽ không giảm bớt, nói cách khác,.

Chứng minh:Cố định một cái giai đoạnCùng điểm.Suy xétTrung từĐếnTùy ý ngắn nhất đường nhỏ.Chiều dài tương đương.Chú ýChỉ có thể bao hàmSau hướng biên cùng trước hướng biên. NếuKhông cóPhía sau, như vậy.Bởi vìCũng làTrung một cái đường nhỏ. Hiện tại, giả thiếtÍt nhất có một cái sau hướng biên thả cái thứ nhất như vậy biên là,Như vậy( bởi vì đệ nhất loại tình huống ). BiênKhông thuộc về,Bởi vậyĐã chịu trước một lần thay đổi tăng quảng lộ ảnh hưởng. Này ý nghĩa.Ngoài ra,.Từ này hai cái phương trình cùngChúng ta được đến.Đường nhỏ còn thừa bộ phận cũng có thể sử dụng tương đồng tư tưởng.

Dẫn lý 2:.

Chứng minh:Từ dẫn lý một chúng ta đến ra,.Giả thiết,Chú ýChỉ có thể bao hàmSau hướng biên cùng trước hướng biên. Này ý nghĩaTrung có một cái ngắn nhất đường nhỏ chưa bị tăng quảng lộ tắc. Này liền hình thành mâu thuẫn.

Thực hiện

Tham khảo 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
structMPM{
structFlowEdge{
intv,u;
longlongcap,flow;

FlowEdge(){}

FlowEdge(int_v,int_u,longlong_cap,longlong_flow)
:v(_v),u(_u),cap(_cap),flow(_flow){}

FlowEdge(int_v,int_u,longlong_cap)
:v(_v),u(_u),cap(_cap),flow(0ll){}
};

constexprstaticlonglongflow_inf=1e18;
vectorFlowEdge>edges;
vectorchar>alive;
vectorlonglong>pin,pout;
vectorlistint>>in,out;
vectorvectorint>>adj;
vectorlonglong>ex;
intn,m=0;
ints,t;
vectorint>level;
vectorint>q;
intqh,qt;

voidresize(int_n){
n=_n;
ex.resize(n);
q.resize(n);
pin.resize(n);
pout.resize(n);
adj.resize(n);
level.resize(n);
in.resize(n);
out.resize(n);
}

MPM(){}

MPM(int_n,int_s,int_t){
resize(_n);
s=_s;
t=_t;
}

voidadd_edge(intv,intu,longlongcap){
edges.push_back(FlowEdge(v,u,cap));
edges.push_back(FlowEdge(u,v,0));
adj[v].push_back(m);
adj[u].push_back(m+1);
m+=2;
}

boolbfs(){
while(qhqt){
intv=q[qh++];
for(intid:adj[v]){
if(edges[id].cap-edges[id].flow1)continue;
if(level[edges[id].u]!=-1)continue;
level[edges[id].u]=level[v]+1;
q[qt++]=edges[id].u;
}
}
returnlevel[t]!=-1;
}

longlongpot(intv){returnmin(pin[v],pout[v]);}

voidremove_node(intv){
for(inti:in[v]){
intu=edges[i].v;
autoit=find(out[u].begin(),out[u].end(),i);
out[u].erase(it);
pout[u]-=edges[i].cap-edges[i].flow;
}
for(inti:out[v]){
intu=edges[i].u;
autoit=find(in[u].begin(),in[u].end(),i);
in[u].erase(it);
pin[u]-=edges[i].cap-edges[i].flow;
}
}

voidpush(intfrom,intto,longlongf,boolforw){
qh=qt=0;
ex.assign(n,0);
ex[from]=f;
q[qt++]=from;
while(qhqt){
intv=q[qh++];
if(v==to)break;
longlongmust=ex[v];
autoit=forw?out[v].begin():in[v].begin();
while(true){
intu=forw?edges[*it].u:edges[*it].v;
longlongpushed=min(must,edges[*it].cap-edges[*it].flow);
if(pushed==0)break;
if(forw){
pout[v]-=pushed;
pin[u]-=pushed;
}else{
pin[v]-=pushed;
pout[u]-=pushed;
}
if(ex[u]==0)q[qt++]=u;
ex[u]+=pushed;
edges[*it].flow+=pushed;
edges[(*it)^1].flow-=pushed;
must-=pushed;
if(edges[*it].cap-edges[*it].flow==0){
autojt=it;
++jt;
if(forw){
in[u].erase(find(in[u].begin(),in[u].end(),*it));
out[v].erase(it);
}else{
out[u].erase(find(out[u].begin(),out[u].end(),*it));
in[v].erase(it);
}
it=jt;
}else
break;
if(!must)break;
}
}
}

longlongflow(){
longlongans=0;
while(true){
pin.assign(n,0);
pout.assign(n,0);
level.assign(n,-1);
alive.assign(n,true);
level[s]=0;
qh=0;
qt=1;
q[0]=s;
if(!bfs())break;
for(inti=0;in;i++){
out[i].clear();
in[i].clear();
}
for(inti=0;im;i++){
if(edges[i].cap-edges[i].flow==0)continue;
intv=edges[i].v,u=edges[i].u;
if(level[v]+1==level[u]&&(level[u]level[t]||u==t)){
in[u].push_back(i);
out[v].push_back(i);
pin[u]+=edges[i].cap-edges[i].flow;
pout[v]+=edges[i].cap-edges[i].flow;
}
}
pin[s]=pout[t]=flow_inf;
while(true){
intv=-1;
for(inti=0;in;i++){
if(!alive[i])continue;
if(v==-1||pot(i)pot(v))v=i;
}
if(v==-1)break;
if(pot(v)==0){
alive[v]=false;
remove_node(v);
continue;
}
longlongf=pot(v);
ans+=f;
push(v,s,f,false);
push(v,t,f,true);
alive[v]=false;
remove_node(v);
}
}
returnans;
}
};

ISAP

Ở Dinic thuật toán trung, chúng ta mỗi lần cầu xong tăng quảng lộ sau đều phải chạy BFS tới phân tầng, có hay không càng cao hiệu phương pháp đâu?

Đáp án chính là phía dưới muốn giới thiệu ISAP thuật toán.

Quá trình

Cùng Dinic thuật toán giống nhau, chúng ta vẫn là trước chạy BFS đối trên bản vẽ điểm tiến hành phân tầng, bất quá cùng Dinic có chút bất đồng chính là, chúng ta lựa chọn ở phản trên bản vẽ, từĐiểm hướngĐiểm tiến hành BFS.

Chấp hành xong phân tầng quá trình sau, chúng ta thông qua DFS tới tìm tăng quảng lộ.

Tăng quảng quá trình cùng Dinic cùng loại, chúng ta chỉ lựa chọn so trước mặt điểm tầng số thiếuĐiểm tới tăng quảng.

Cùng Dinic bất đồng chính là, chúng ta cũng không sẽ trọng chạy BFS tới đối trên bản vẽ điểm một lần nữa phân tầng, mà là ở tăng quảng trong quá trình liền hoàn thành trọng phân tầng quá trình.

Cụ thể tới nói, thiếtHào điểm tầng vì,Khi chúng ta kết thúc ởHào điểm tăng quảng quá trình sau, chúng ta biến lịch tàn lượng trên mạngSở hữu ra biên, tìm được tầng nhỏ nhất ra điểm,Theo sau lệnh.Đặc biệt mà, nếu tàn lượng trên mạngVô ra biên, tắc.

Dễ dàng phát hiện, đươngKhi, trên bản vẽ không tồn tại tăng quảng lộ, lúc này có thể ngưng hẳn thuật toán.

Cùng Dinic cùng loại, ISAP trung cũng tồn tạiTrước mặt hình cung ưu hoá.

Mà ISAP còn tồn tại một cái khác ưu hoá, chúng ta ký lục tầng số vìĐiểm số lượng,Mỗi khi đem một cái điểm tầng số từĐổi mới đếnKhi, đồng thời đổi mớiSố tổ giá trị, nếu ở đổi mới sau,Tắc ý nghĩa trên bản vẽ xuất hiện kết thúc tầng, vô pháp lại tìm được tăng quảng lộ, lúc này có thể trực tiếp ngưng hẳn thuật toán ( thực hiện khi trực tiếp đemTiêu vì), nên ưu hoá được xưng làGAP ưu hoá.

Thực hiện

Tham khảo 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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
structEdge{
intfrom,to,cap,flow;

Edge(intu,intv,intc,intf):from(u),to(v),cap(c),flow(f){}
};

booloperator(constEdge&a,constEdge&b){
returna.fromb.from||(a.from==b.from&&a.tob.to);
}

structISAP{
intn,m,s,t;
vectorEdge>edges;
vectorint>G[MAXN];
boolvis[MAXN];
intd[MAXN];
intcur[MAXN];
intp[MAXN];
intnum[MAXN];

voidAddEdge(intfrom,intto,intcap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}

boolBFS(){
memset(vis,0,sizeof(vis));
queueint>Q;
Q.push(t);
vis[t]=true;
d[t]=0;
while(!Q.empty()){
intx=Q.front();
Q.pop();
for(inti=0;iG[x].size();i++){
Edge&e=edges[G[x][i]^1];
if(!vis[e.from]&&e.cap>e.flow){
vis[e.from]=true;
d[e.from]=d[x]+1;
Q.push(e.from);
}
}
}
returnvis[s];
}

voidinit(intn){
this->n=n;
for(inti=0;in;i++)G[i].clear();
edges.clear();
}

intAugment(){
intx=t,a=INF;
while(x!=s){
Edge&e=edges[p[x]];
a=min(a,e.cap-e.flow);
x=edges[p[x]].from;
}
x=t;
while(x!=s){
edges[p[x]].flow+=a;
edges[p[x]^1].flow-=a;
x=edges[p[x]].from;
}
returna;
}

intMaxflow(ints,intt){
this->s=s;
this->t=t;
intflow=0;
BFS();
memset(num,0,sizeof(num));
for(inti=0;in;i++)num[d[i]]++;
intx=s;
memset(cur,0,sizeof(cur));
while(d[s]n){
if(x==t){
flow+=Augment();
x=s;
}
intok=0;
for(inti=cur[x];iG[x].size();i++){
Edge&e=edges[G[x][i]];
if(e.cap>e.flow&&d[x]==d[e.to]+1){
ok=1;
p[e.to]=G[x][i];
cur[x]=i;
x=e.to;
break;
}
}
if(!ok){
intm=n-1;
for(inti=0;iG[x].size();i++){
Edge&e=edges[G[x][i]];
if(e.cap>e.flow)m=min(m,d[e.to]);
}
if(--num[d[x]]==0)break;
num[d[x]=m+1]++;
cur[x]=0;
if(x!=s)x=edges[p[x]].from;
}
}
returnflow;
}
};

Push-Relabel dự lưu đẩy mạnh thuật toán

Nên phương pháp ở cầu giải trong quá trình xem nhẹ lưu thủ kiên định, cũng mỗi lần đối một cái giao điểm đổi mới tin tức, lấy cầu giải lớn nhất lưu.

Thông dụng dự lưu đẩy mạnh thuật toán

Đầu tiên chúng ta giới thiệu dự lưu đẩy mạnh thuật toán chủ yếu tư tưởng, cùng với một cái được không bạo lực thực hiện thuật toán.

Dự lưu đẩy mạnh thuật toán thông qua đối đơn cái giao điểm đổi mới thao tác, thẳng đến không có giao điểm yêu cầu đổi mới tới cầu giải lớn nhất lưu.

Thuật toán quá trình giữ gìn lưu hàm số không nhất định bảo trì lưu thủ kiên định, đối với một cái giao điểm, chúng ta cho phép tiến vào giao điểm lưu vượt qua chảy ra giao điểm lưu, vượt qua bộ phận được xưng là giao điểmVượt mức lưu:

Nếu,Xưng giao điểmTràn ra6,Chú ý khi chúng ta nhắc tới tràn ra giao điểm khi, cũng không bao gồmCùng.

Dự lưu đẩy mạnh thuật toán giữ gìn mỗi cái giao điểm độ cao,Hơn nữa quy định tràn ra giao điểmNếu muốn đẩy đưa vượt mức lưu, chỉ có thể hướng độ cao nhỏ hơnGiao điểm đẩy đưa; nếuKhông có liền nhau độ cao nhỏ hơnGiao điểm, liền sửa chữaĐộ cao ( trọng dán nhãn ).

Độ cao hàm số7

Chính xác ra, dự lưu đẩy mạnh giữ gìn dưới một cái chiếu rọi:

XưngLà tàn lượng internetĐộ cao hàm số.

Dẫn lý 1: ThiếtThượng độ cao hàm số vì,Đối với tùy ý hai cái giao điểm,Nếu,TắcKhông phảiTrung biên.

Thuật toán sẽ chỉ ởBiên chấp hành đẩy đưa.

Đẩy đưa ( Push )

Áp dụng điều kiện: Giao điểmTràn ra, thả tồn tại giao điểm,Tắc push thao tác áp dụng với.

Vì thế, chúng ta tận khả năng đem vượt mức lưu từĐẩy đưa đến,Đẩy đưa trong quá trình chúng ta chỉ quan tâm vượt mức lưu cùngNhỏ nhất giá trị, không quan tâmHay không tràn ra.

NếuỞ đẩy đưa xong lúc sau mãn lưu, đem này từ tàn lượng internet trung xóa bỏ.

Trọng dán nhãn ( Relabel )

Áp dụng điều kiện: Nếu giao điểmTràn ra, thả,Tắc relabel thao tác áp dụng với.

Tắc đemĐổi mới vìLà được.

Khởi động lại

Kể trên đemTràn ngập lưu, cũng đemNâng lên, khiến cho,Bởi vì,Hơn nữaRốt cuộc mãn lưu, không cần thiết lưu tại tàn lượng internet trung; kể trên còn đemKhởi động lại vìTương phản số.

Quá trình

Chúng ta mỗi lần rà quét toàn bộ đồ, chỉ cần tồn tại giao điểmThỏa mãn push hoặc relabel thao tác điều kiện, liền chấp hành đối ứng thao tác.

Như đồ, mỗi cái giao điểm trung gian tỏ vẻ đánh số, tả hạ tỏ vẻ độ cao giá trị,Hữu hạ tỏ vẻ vượt mức lưu,Giao điểm nhan sắc chiều sâu cũng tỏ vẻ giao điểm độ cao; biên quyền tỏ vẻ,Màu xanh lục biên tỏ vẻ thỏa mãnBiên( tức tàn lượng internet biên):

p1

Toàn bộ thuật toán chúng ta đại khái xem một chút quá trình, nơi này người viết sử dụng chính là một cái bạo lực thuật toán, tức bạo lực rà quét hay không có tràn ra giao điểm, có liền đổi mới

p2

Kết quả cuối cùng

p3

Có thể phát hiện, cuối cùng vượt mức lưu một bộ phận về tới,Thả trừ bỏ nguyên điểm hối điểm, mặt khác giao điểm đều không có tràn ra; lúc này lưu hàm sốThỏa mãn lưu thủ kiên định, vì lớn nhất lưu, lưu lượng tức vì.

Nhưng là trên thực tế luận văn3Chỉ ra chỉ xử lý độ cao nhỏ hơnTràn ra tiết điểm cũng có thể đạt được chính xác lớn nhất lưu giá trị, bất quá cứ như vậy thuật toán kết thúc thời điểm dự lưu còn không thỏa mãn lưu hàm số tính chất, không thể biết mỗi điều bên cạnh chân thật lưu lượng.

Thực hiện

Trung tâm 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
constexprintN=1e4+4,M=1e5+5,INF=0x3f3f3f3f;
intn,m,s,t,maxflow,tot;
intht[N],ex[N];

voidinit(){// khởi động lại
for(inti=h[s];i;i=e[i].nex){
constint&v=e[i].t;
ex[v]=e[i].v,ex[s]-=ex[v],e[i^1].v=e[i].v,e[i].v=0;
}
ht[s]=n;
}

boolpush(inted){
constint&u=e[ed^1].t,&v=e[ed].t;
intflow=min(ex[u],e[ed].v);
ex[u]-=flow,ex[v]+=flow,e[ed].v-=flow,e[ed^1].v+=flow;
returnex[u];// nếu u vẫn tràn ra, phản hồi 1
}

voidrelabel(intu){
ht[u]=INF;
for(inti=h[u];i;i=e[i].nex)
if(e[i].v)ht[u]=min(ht[u],ht[e[i].t]);
++ht[u];
}

HLPP thuật toán

Tối cao cấp dự lưu đẩy mạnh thuật toán ( Highest Label Preflow Push ) ở kể trên thông dụng dự lưu đẩy đưa thuật toán trung, ở mỗi lần lựa chọn giao điểm khi, đều ưu tiên lựa chọn độ cao tối cao tràn ra giao điểm, này thuật toán thuật toán phức tạp độ vì.

Quá trình

Cụ thể mà nói, HLPP thuật toán quá trình như sau:

  1. Khởi động lại ( căn cứ vào dự lưu đẩy mạnh thuật toán );
  2. Lựa chọn tràn ra giao điểm trung độ cao tối cao giao điểm,Cũng đối nó sở hữu có thể đẩy đưa biên tiến hành đẩy đưa;
  3. NếuVẫn tràn ra, đối nó trọng dán nhãn, trở lại bước đi 2;
  4. Nếu không có tràn ra giao điểm, thuật toán kết thúc.

Một thiên đối lớn nhất lưu thuật toán thực tế biểu hiện tiến hành thí nghiệm luận văn4Cho thấy, trên thực tế căn cứ vào dự lưu thuật toán, có tương đương một bộ phận thời gian đều hoa ở trọng dán nhãn này một bước thượng. Dưới giới thiệu hai loại đến từ luận văn5Có thể lộ rõ giảm bớt trọng dán nhãn số lần ưu hoá.

BFS ưu hoá

HLPP thượng giới vì,Nhưng ở sử dụng khi tạp đến tương đối khẩn; chúng ta có thể ở khởi động lại độ cao thời điểm tiến hành ưu hoá. Cụ thể tới nói, chúng ta khởi động lạiĐếnNgắn nhất khoảng cách; đặc biệt mà,.

Ở BFS đồng thời chúng ta thuận tiện kiểm tra đồ liên thông tính, bài trừ vô giải tình huống.

GAP ưu hoá

HLPP đẩy đưa điều kiện là,Mà nếu ở thuật toán mỗ nhất thời khắc, tồn tại nào đó,Khiến choGiao điểm cái số vì,Như vậy đối vớiGiao điểm liền vĩnh viễn vô pháp đẩy đưa vượt mức chảy tới,Bởi vậy chỉ có thể đưa về,Như vậy chúng ta đúng lúc này trực tiếp làm cho bọn họ độ cao biến thành ít nhất,Lấy mau chóng đẩy đưa về,Giảm bớt trọng dán nhãn thao tác.

Dưới thực hiện áp dụng luận văn4Trung thực hiện phương pháp, sử dụngCái thùngB,Trong đóB[i]Trung ký lục sở hữu trước mặt độ cao vìTràn ra tiết điểm. Gia nhập trở lên nhắc tới hai loại ưu hoá, hơn nữa chỉ xử lý độ cao nhỏ hơnTràn ra tiết điểm.

Đáng chú ý chính là luận văn4Trung sử dụng thùng là căn cứ vào liên biểu sạn, mà STL trungstackCam chịu vật chứa làdeque.Trải qua đơn giản thí nghiệm phát hiệnvector,deque,listỞ chủ đề thực tế vận hành trong quá trình hiệu suất khác nhau không lớn.

Thực hiện

LuoguP4722【 khuôn mẫu 】 lớn nhất lưu tăng mạnh bản / dự lưu đẩy mạnh
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include&LTcstdio>
#include&LTcstring>
#include&LTqueue>
#include&LTstack>
usingnamespacestd;
constexprintN=1200,M=120000,INF=0x3f3f3f3f;
intn,m,s,t;

structqxx{
intnex,t;
longlongv;
};

qxxe[M*2+1];
inth[N+1],cnt=1;

voidadd_path(intf,intt,longlongv){
e[++cnt]=qxx{h[f],t,v},h[f]=cnt;
}

voidadd_flow(intf,intt,longlongv){
add_path(f,t,v);
add_path(t,f,0);
}

intht[N+1];// độ cao;
longlongex[N+1];// vượt mức lưu;
intgap[N];// gap ưu hoá. gap[i] vì độ cao vì i tiết điểm số lượng
stackint>B[N];// thùng B[i] trung ký lục sở hữu ht[v]==i v
intlevel=0;// tràn ra tiết điểm tối cao độ cao

intpush(intu){// tận khả năng thông qua có thể đẩy đưa biên đẩy đưa vượt mức lưu
boolinit=u==s;// hay không ở khởi động lại
for(inti=h[u];i;i=e[i].nex){
constint&v=e[i].t;
constlonglong&w=e[i].v;
// khởi động lại khi không suy xét độ cao kém vì 1
if(!w||(init==false&&ht[u]!=ht[v]+1)||ht[v]==INF)continue;
longlongk=init?w:min(w,ex[u]);
// vào tay còn thừa dung lượng cùng vượt mức lưu nhỏ nhất giá trị, khởi động lại khi có thể sử nguyên tràn ra lượng vì số âm.
if(v!=s&&v!=t&&!ex[v])B[ht[v]].push(v),level=max(level,ht[v]);
ex[u]-=k,ex[v]+=k,e[i].v-=k,e[i^1].v+=k;// push
if(!ex[u])return0;// nếu đã đẩy đưa xong liền phản hồi
}
return1;
}

voidrelabel(intu){// trọng dán nhãn ( độ cao )
ht[u]=INF;
for(inti=h[u];i;i=e[i].nex)
if(e[i].v)ht[u]=min(ht[u],ht[e[i].t]);
if(++ht[u]n){// chỉ xử lý độ cao nhỏ hơn n tiết điểm
B[ht[u]].push(u);
level=max(level,ht[u]);
++gap[ht[u]];// tân độ cao, đổi mới gap
}
}

boolbfs_init(){
memset(ht,0x3f,sizeof(ht));
queueint>q;
q.push(t),ht[t]=0;
while(q.size()){// ngược hướng BFS, gặp được không có phỏng vấn quá giao điểm liền nhập đội
intu=q.front();
q.pop();
for(inti=h[u];i;i=e[i].nex){
constint&v=e[i].t;
if(e[i^1].v&&ht[v]>ht[u]+1)ht[v]=ht[u]+1,q.push(v);
}
}
returnht[s]!=INF;// nếu đồ không liên thông, phản hồi 0
}

// tuyển ra trước mặt độ cao lớn nhất tiết điểm chi nhất, nếu đã không có tràn ra tiết điểm phản hồi 0
intselect(){
while(level>-1&&B[level].size()==0)level--;
returnlevel==-1?0:B[level].top();
}

longlonghlpp(){// phản hồi lớn nhất lưu
if(!bfs_init())return0;// đồ không liên thông
memset(gap,0,sizeof(gap));
for(inti=1;in;i++)
if(ht[i]!=INF)gap[ht[i]]++;// khởi động lại gap
ht[s]=n;
push(s);// khởi động lại dự lưu
intu;
while((u=select())){
B[level].pop();
if(push(u)){// vẫn cứ tràn ra
if(!--gap[ht[u]])
for(inti=1;in;i++)
if(i!=s&&ht[i]>ht[u]&&ht[i]n+1)
ht[i]=n+1;// nơi này trọng dán thành n+1 tiết điểm đều không phải tràn ra tiết điểm
relabel(u);
}
}
returnex[t];
}

intmain(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(inti=1,u,v,w;im;i++){
scanf("%d%d%d",&u,&v,&w);
add_flow(u,v,w);
}
printf("%lld",hlpp());
return0;
}

Cảm thụ một chút vận hành quá trình

HLPP

Trong đó pic13 đến pic14 chấp hành Relabel(4), cũng tiến hành GAP ưu hoá.

Chú thích


  1. http://pisces.ck.tp.edu.tw/~peng/index.php?action=showfile&file=f6cdf7ef750d7dc79c7d599b942acbaaee86a2e3e

  2. https://people.orie.cornell.edu/dpw/orie633/LectureNotes/lecture9.pdf

  3. Cherkassky B V, Goldberg A V. On implementing push-relabel method for the maximum flow problem[C]//International Conference on Integer Programming and Combinatorial Optimization. Springer, Berlin, Heidelberg, 1995: 157-171.

  4. Ahuja R K, Kodialam M, Mishra A K, et al. Computational investigations of maximum flow algorithms[J]. European Journal of Operational Research, 1997, 97(3): 509-542.

  5. Derigs U, Meier W. Implementing Goldberg's max-flow-algorithm—A computational investigation[J]. Zeitschrift für Operations Research, 1989, 33(6): 383-403.

  6. Tiếng Anh văn hiến trung thông thường xưng là “active”.

  7. Ở tiếng Anh văn hiến trung, một cái giao điểm độ cao thông thường được xưng là “distance label”. Nơi này sử dụng “Độ cao” thuật này ngữ nguyên tự thuật toán lời giới thiệu trung tương quan chương. Ngươi có thể ở máy móc công nghiệp nhà xuất bản thuật toán lời giới thiệu ( nguyên thư đệ 3 bản ) P432 chú thích trung tìm được làm như vậy lý do.