Pagini recente » Cod sursa (job #2380014) | Cod sursa (job #1244153) | Cod sursa (job #1799275) | Cod sursa (job #2976887) | Cod sursa (job #1855436)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NRMAX 1001
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int capacity[NRMAX][NRMAX] , flow[NRMAX][NRMAX];
int n , m , x , y , c , flowt , maxflow;
vector < int > graph[NRMAX];
queue < int > Q;
bool used[NRMAX];
int tata[NRMAX];
int bfs ()
{
for(int i = 1; i <= n ; i++ ) used[i] = 0;
Q.push(1);
used[1] = 1;
int gasit = 0;
while ( !Q.empty() )
{
int nod = Q.front();
Q.pop();
if ( nod == n )
{
gasit = 1;
continue;
}
for ( int i = 0 ; i < graph[nod].size(); i++ )
{
int vecin = graph[nod][i];
if ( !used[vecin] and capacity[nod][vecin] > flow[nod][vecin] )
{
used[vecin] = 1;
tata[vecin] = nod;
Q.push(vecin);
}
}
}
return gasit;
}
int main()
{
f >> n >> m;
for ( ; m-- ; )
{
f >> x >> y >> c;
capacity[x][y] += c;
graph[x].pb(y);
graph[y].pb(x);
}
for ( ; bfs(); )
{
for ( int i = 0 ; i < graph[n].size(); i++ )
{
int vecin = graph[n][i];
tata[n] = vecin;
if ( !used[vecin] or capacity[vecin][n] == flow[vecin][n] ) continue;
int minim = 9999999;
for ( int start = n ; start != 1; start=tata[start] )
{
minim = min(minim, capacity[tata[start]][start] - flow[tata[start]][start]);
}
if ( minim == 0 ) continue;
maxflow += minim;
for ( int start = n ; start != 1; start=tata[start] )
{
flow[tata[start]][start] += minim;
flow[start][tata[start]] -= minim;
}
}
}
g << maxflow;
return 0;
}