// 网络流 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;
}
【算法】dinic
最新推荐文章于 2023-05-06 20:11:22 发布