Pagini recente » Cod sursa (job #1056283) | Cod sursa (job #3133961) | Cod sursa (job #2297915) | Cod sursa (job #54094) | Cod sursa (job #2566177)
#include <bits/stdc++.h>
#define Dim 1001
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef long long ll;
int N,M,T[Dim];
int a,b,c,C[Dim][Dim],flow;
int viz[Dim];
vector < int > V[Dim];
bool BFS()
{
queue < int > qu;
for(int i=1;i<=N;i++)
{
T[i]=0;
viz[i]=0;
}
viz[1]=1;
qu.push(1);
T[1]=0;
while(!qu.empty())
{
int nod=qu.front();
qu.pop();
viz[nod]=2;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i];
if( viz[vecin] == 0 && C[nod][vecin] > 0 )
{
viz[vecin]=1;
qu.push(vecin);
T[vecin]=nod;
}
}
}
if( viz[N]!=2 ) return false;
return true;
}
int main()
{
f>>N>>M;
for(int i=1;i<=M;i++)
{
f>>a>>b>>c;
C[a][b]=c;
V[a].push_back(b);
V[b].push_back(a);
}
while( BFS() )
{
for(unsigned int i=0;i<V[N].size();i++)
{
int vecin=V[N][i];
T[N]=vecin;
if( viz[vecin] == 2 && C[vecin][N] >= 0 )
{
int minim=INT_MAX;
int start=N;
while( T[start] )
{
minim=min(minim,C[T[start]][start]);
start=T[start];
}
flow+=minim;
start=N;
while( T[start] )
{
C[T[start]][start]-=minim;
C[start][T[start]]+=minim;
start=T[start];
}
}
}
}
g<<flow;
return 0;
}