Pagini recente » Cod sursa (job #2337381) | Cod sursa (job #2719871) | Cod sursa (job #1871266) | Rating Paraschiva Octavian (ottoalex293) | Cod sursa (job #800861)
Cod sursa(job #800861)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int Nmax = 1010;
vector<int> A[Nmax];
int C[Nmax][Nmax];
int N,M,Flux;
int Dad[Nmax],Marked[Nmax];
queue<int> Q;
typedef vector<int>::iterator IT;
bool BF()
{
memset(Dad,0,sizeof(Dad));
memset(Marked,0,sizeof(Marked));
Marked[1] = 1;
for ( Q.push(1) ; Q.size() ; Q.pop() )
for ( IT it = A[Q.front()].begin() ; it!= A[Q.front()].end() ; ++it )
if ( !Marked[ *it ] && C[Q.front()][ *it ] != 0 )
{
Marked[ *it ] = 1;
if ( *it == N ) continue;
Dad[ *it ] = Q.front();
Q.push( *it );
}
return Marked[N];
}
ifstream F("maxflow.in");
ofstream G("maxflow.out");
int main()
{
F>>N>>M;
for (int i=1,x,y,c;i<=M;++i)
{
F>>x>>y>>c;
A[ x ].push_back( y );
A[ y ].push_back( x );
C[x][y]=c;
}
Flux = 0;
while ( BF() )
for ( IT it = A[N].begin(); it!=A[N].end(); ++it )
{
int Nod , Flow = C[ *it ][ N ];
if ( Flow == 0 || Marked[ *it ] == 0 ) continue;
for ( Nod = *it ; Nod != 1 ; Nod = Dad[Nod] )
Flow = min ( Flow , C[ Dad[Nod] ][ Nod ] );
if ( Flow == 0 ) continue;
for ( Nod = *it ; Nod != 1 ; Nod = Dad[Nod] )
{
C[Dad[Nod]][Nod] -= Flow;
C[Nod][Dad[Nod]] += Flow;
}
C[*it][N] -= Flow;
C[N][*it] += Flow;
Flux += Flow;
}
G<<Flux<<'\n';
}