Pagini recente » Cod sursa (job #605608) | Cod sursa (job #2908395) | Cod sursa (job #430452) | Cod sursa (job #2621605) | Cod sursa (job #2520553)
#include <bits/stdc++.h>
#define Dim 1001
#define Max 110000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");// 0 nedescoperit-0 examinat-1 aruncat-2
typedef pair < int,int > pi;
vector < pi > V[Dim];
int N,M,x,y,z,C[Dim][Dim];
long long flow;
bool viz[Dim];
bool BFS(int tata[])
{
queue <int> qu;
for(int i=1;i<=N;i++) tata[i]=-1,viz[i]=0;
viz[1]=1;
tata[1]=-1;
qu.push(1);
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].first;
int cost=V[nod][i].second;
if( viz[vecin]==0 && C[nod][vecin] > 0 )
{
viz[vecin]=1;
tata[vecin]=nod;
qu.push(vecin);
}
}
}
if( !viz[N] ) return 0;
return 1;
}
int main()
{
f>>N>>M;
for(int i=1;i<=M;i++)
{
f>>x>>y>>z;
V[x].push_back({y,z});
C[x][y]=z;
}
int tata[Dim];
while( BFS(tata) )
{
int minim=Max;
int nod_cur=N;
while( tata[nod_cur] != -1 )
{
minim=min(minim,C[ tata[ nod_cur ] ][ nod_cur ] );
nod_cur=tata[nod_cur];
}
nod_cur=N;
while( tata[ nod_cur ] != -1 )
{
C[ tata[ nod_cur ] ][ nod_cur ]-=minim;
C[ nod_cur ][ tata[ nod_cur ] ]+=minim;
nod_cur=tata[nod_cur];
}
flow+=minim;
}
g<<flow;
return 0;
}