Pagini recente » Cod sursa (job #2197056) | Cod sursa (job #867877) | Cod sursa (job #1990291) | Cod sursa (job #532334) | Cod sursa (job #571449)
Cod sursa(job #571449)
#include<cstdio>
#include<vector>
#include<queue>
#define minim(a, b) ((a)<=(b)?(a):(b))
#define InFile "maxflow.in"
#define OutFile "maxflow.out"
using namespace std;
const int MaxN = 1001;
const int INF = 0x3f3f3f3f;
int n,m,viz[MaxN],C[MaxN][MaxN],F[MaxN][MaxN],T[MaxN];
vector<int> G[MaxN];
queue<int> Q;
int BFS( int Sursa , int Destinatie )
{
int nod;
memset(viz,0,sizeof(viz));
Q.push(Sursa);
viz[Sursa] = true;
while( !Q.empty() )
{
nod = Q.front();
Q.pop();
if( nod == Destinatie )
continue;
vector<int>::iterator it;
for( it = G[nod].begin() ; it != G[nod].end() ; ++it )
if( !viz[*it] && C[nod][*it] > F[nod][*it] )
{
Q.push(*it);
T[*it] = nod;
viz[*it] = true;
}
}
return viz[Destinatie];
}
int main()
{
freopen( InFile , "r" , stdin );
scanf("%d%d" , &n , &m );
int i,x,y,c;
for( i = 0 ; i < m ; i++ )
{
scanf("%d%d%d" , &x , &y , &c );
C[x][y] = c;
G[x].push_back(y);
G[y].push_back(x);
}
int flux = 0;
while( BFS(1,n) )
{
vector<int>::iterator it;
int nod,min1;
for( it = G[n].begin() ; it != G[n].end() ; ++it )
{
if( T[*it] && C[*it][n] > F[*it][n] )
{
T[n] = *it;
min1 = INF;
nod = n;
while( nod != 1 )
{
min1 = minim(min1 , C[T[nod]][nod] - F[T[nod]][nod]);
nod = T[nod];
}
nod = n;
while( nod != 1 )
{
F[T[nod]][nod] += min1;
F[nod][T[nod]] -= min1;
nod = T[nod];
}
flux += min1 ;
}
}
}
freopen( OutFile , "w" , stdout );
printf("%d\n" , flux );
return 0;
}