-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathBoundedMaxflow.cpp
44 lines (44 loc) · 1.41 KB
/
BoundedMaxflow.cpp
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
// flow use ISAP
// Max flow with lower/upper bound on edges
// source = 1 , sink = n
int in[ N ] , out[ N ];
int l[ M ] , r[ M ] , a[ M ] , b[ M ];//0-base,a下界,b上界
int solve(){
flow.init( n ); //n為點的數量,m為邊的數量,點是1-base
for( int i = 0 ; i < m ; i ++ ){
in[ r[ i ] ] += a[ i ];
out[ l[ i ] ] += a[ i ];
flow.addEdge( l[ i ] , r[ i ] , b[ i ] - a[ i ] );
// flow from l[i] to r[i] must in [a[ i ], b[ i ]]
}
int nd = 0;
for( int i = 1 ; i <= n ; i ++ ){
if( in[ i ] < out[ i ] ){
flow.addEdge( i , flow.t , out[ i ] - in[ i ] );
nd += out[ i ] - in[ i ];
}
if( out[ i ] < in[ i ] )
flow.addEdge( flow.s , i , in[ i ] - out[ i ] );
}
// original sink to source
flow.addEdge( n , 1 , INF );
if( flow.maxflow() != nd )
return -1; // no solution
int ans = flow.G[ 1 ].back().c; // source to sink
flow.G[ 1 ].back().c = flow.G[ n ].back().c = 0;
// take out super source and super sink
for( size_t i = 0 ; i < flow.G[ flow.s ].size() ; i ++ ){
flow.G[ flow.s ][ i ].c = 0;
Edge &e = flow.G[ flow.s ][ i ];
flow.G[ e.v ][ e.r ].c = 0;
}
for( size_t i = 0 ; i < flow.G[ flow.t ].size() ; i ++ ){
flow.G[ flow.t ][ i ].c = 0;
Edge &e = flow.G[ flow.t ][ i ];
flow.G[ e.v ][ e.r ].c = 0;
}
flow.addEdge( flow.s , 1 , INF );
flow.addEdge( n , flow.t , INF );
flow.reset();
return ans + flow.maxflow();
}