Pagini recente » Cod sursa (job #3134380) | Cod sursa (job #1211996) | Cod sursa (job #216472) | Cod sursa (job #664411) | Cod sursa (job #2123958)
#include <bits/stdc++.h>
#define NMAX 1001
using namespace std;
ifstream fin ("maxflow.in") ;
ofstream fout("maxflow.out") ;
int n , m ;
int cap[NMAX][NMAX] , flux[NMAX][NMAX] , t[NMAX] ;
vector<int> graf[NMAX] ;
bool viz[NMAX] ;
void citire()
{
int i , x , y , c ;
fin >> n >> m ;
for ( i = 1 ; i <= m ; i++ )
{
fin >> x >> y >> c ;
graf[x].push_back(y) ;
graf[y].push_back(x) ;
cap[x][y] = c ;
}
}
int BFS()
{
int nod ;
queue<int> Q ;
Q.push(1) ;
memset(viz,false,n+1) ;
viz[1] = 1 ;
Q.push(1) ;
while(!Q.empty())
{
nod = Q.front() ;
Q.pop() ;
if ( nod == n )
continue ;
for ( int i = 0 ; i < graf[nod].size() ; i++ )
{
if ( cap[nod][graf[nod][i]] == flux[nod][graf[nod][i]] || viz[graf[nod][i]] )
continue ;
Q.push(graf[nod][i]) ;
viz[graf[nod][i]] = true ;
t[graf[nod][i]] = nod ;
}
}
return viz[n] ;
}
int main()
{
int flx = 0, fmin , i , j ;
citire() ;
while(BFS())
{
for ( j = 0 ; j < graf[n].size() ; j++ )
{
if ( !viz[graf[n][j]] || cap[graf[n][j]][n]==flux[graf[n][j]][n] )
continue ;
t[n] = graf[n][j] ;
fmin = 0x3f3f3f3f;
for ( i = n ; i > 1 ; i = t[i] )
fmin = min(fmin,cap[t[i]][i]-flux[t[i]][i]) ;
if ( fmin == 0 )
continue ;
for ( i = n ; i > 1 ; i = t[i] )
{
flux[t[i]][i] = flux[t[i]][i] + fmin ;
flux[i][t[i]] = flux[i][t[i]] - fmin ;
}
flx = flx+fmin ;
}
}
fout << flx ;
}