【算法】dinic
来源:互联网 发布:新手怎么学做淘宝客服 编辑:程序博客网 时间:2024/04/29 03:49
// 网络流 dinic 算法bool bfs( ){ memset( dis, -1, sizeof dis ); int i, j, clo = 0, open = 1; q[1] = n, dis[n] = 0; while( clo < open ) { i = q[++clo]; for( int k = h[i]; k; k = next[k] ) { j = g[k]; if( c[k^1] > 0 && dis[j] == -1 ) { q[++open] = j, dis[j] = dis[i]+1; if( j == 1 ) return true; } } } return false;}void dfs( ){ memset( s, -1, sizeof s ); int i = 1, j, k; while( dis[1] != -1 ) { if( s[i] == -1 ) k = h[i]; else k = s[i]; for( ; k; k = next[k] ) { j = g[k]; if( c[k] > 0 && dis[j] == dis[i]-1 ) { s[i] = k, pre[j] = i, i = j; if( j == n ) update( ), i = w; break; } } if( !k ) dis[i] = -1, i = pre[i]; }}void update( ){ int minn = 2000000000; for( int i = pre[n]; i; i = pre[i] ) if( c[ s[i] ] <= minn ) minn = c[ s[i] ], w = i; for( int i = pre[n]; i; i = pre[i] ) c[ s[i] ] -= minn, c[ s[i]^1 ] += minn; ans += minn;}