【算法】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;}


原创粉丝点击