最小割

Posted zuotte0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小割相关的知识,希望对你有一定的参考价值。

题目:http://hihocoder.com/problemset/problem/1378

在求出最大流之后遍历一下最后一次标记的的点,即为S集合。

题目本身对最小割介绍的不错。

最小割模板:

 1 #include "iostream"
 2 #include "algorithm"
 3 #include "stdlib.h"
 4 #include "queue"
 5 #include "memory.h"
 6 using namespace std;
 7 #define inf 0x3f3f3f3f
 8 int n, m;
 9 int pic[505][505], flow[505], pre[505], ans[505];
10 
11 int bfs(){
12     int i, t;
13     queue<int> s;
14     memset(flow, 0, sizeof(flow));
15     memset(pre, -1, sizeof(pre));
16     s.push(1);
17     flow[1] = inf;
18     while(!s.empty()){
19         t = s.front();
20         if(t == n) return flow[n];
21         s.pop();
22         for(i = 2; i <= n; i++){
23             if(pic[t][i]>0 && pre[i] == -1){
24                 flow[i] = min(flow[t], pic[t][i]);
25                 pre[i] = t;
26                 s.push(i);
27             }
28         }
29     }
30     return flow[n];
31 }
32 void EK(){
33     int i, maxflow = 0, cnt, add, now;
34     while(add = bfs()){
35         maxflow += add;
36         now = n;
37         while(now != 1){
38             pic[pre[now]][now] -= add;
39             pic[now][pre[now]] += add;
40             now = pre[now];
41         }
42     }
43     cnt = 0;
44     for(i = 0 ;i <= n; i++){
45         if(flow[i]) ans[cnt++] = i;
46     }
47     cout<<maxflow<< <<cnt<<endl;
48     for(i = 0 ;i < cnt; i++) cout<<ans[i]<< ;
49     cout<<endl; 
50 }
51 int main(){
52     //freopen("test.txt", "r", stdin);/////////////
53     int u, v, c;
54     while(cin>>n>>m){
55         memset(pic, 0, sizeof(pic));
56         for(int i = 0; i < m; i++){
57             cin>>u>>v>>c;
58             pic[u][v] += c;
59         }
60         EK();
61     }
62     return 0;
63 } 

 

以上是关于最小割的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4519: [Cqoi2016]不同的最小割(分治最小割)

「CQOI2016」不同的最小割

bzoj2229 Zjoi2011—最小割

关于最小割的进一步理解

hdu 5889 Barricade最小割

hdu 5889 Barricade最小割