View code
Int Dist [n < 1 ], MX [N], my [N], M, N;
Vector < Int > Map [N];
Int Que [n < 1 ], Head, tail;
Int BFS ()
{
Int I;
Head = 0 ; Tail =- 1 ;
For (I = 1 ; I <= N; I ++ )
If (MX [I] =- 1 ) Que [ ++ Tail] = I;
For (I = 0 ; I <= M + N; I ++ ) Dist [I] = 0 ;
Int Flag = 0 ;
While (Head <= Tail)
{
Int U = Que [Head ++ ];
For (I = 0 ; I < Map [u]. Size (); I ++ )
{
Int V = Map [u] [I];
If (Dist [n + V] = 0 )
{
Dist [n + V] = Dist [u] + 1 ;
If (My [v] ! =- 1 )
{
Dist [my [v] = Dist [n + V] + 1 ;
Que [ ++ Tail] = My [v];
}
Else Flag = 1 ;
}
}
}
Return Flag;
}
Int DFS ( Int U)
{
For ( Int I = 0 ; I < Map [u]. Size (); I ++ )
{
Int V = Map [u] [I];
If (Dist [u] + 1 = Dist [V + N])
{
Int T = My [v];
Dist [V + N] = 0 ;
If (T =- 1 | DFS (t ))
{
My [v] = U;
MX [u] = V;
Return 1 ;
}
}
}
Return 0 ;
}
Int H_k ()
{
Int I;
For (I = 0 ; I <= N; I ++ ) MX [I] =- 1 ;
For (I = 0 ; I <= M; I ++ ) My [I] =- 1 ;
Int Ans = 0 ;
While (BFS ())
{
For (I = 1 ; I <= N; I ++ )
If (MX [I] =- 1 && DFS (I) ans ++ ;
}
Return Ans;
}