Pagini recente » Cod sursa (job #1637439) | Cod sursa (job #2950460) | Cod sursa (job #1400098) | Cod sursa (job #1666077) | Cod sursa (job #1437783)
#include <iostream>
#include <vector>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
#define pb push_back
#define iterator vector<int>::iterator
const int NMAX = 1024;
const int INF = 1 << 30;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";
int capacitate[NMAX][NMAX];
int flux[NMAX][NMAX];
int tata[NMAX];
int viz[NMAX];
vector<int> graf[NMAX];
int n, m;
bool BF()
{
int sursa = 1, dest = n, q[NMAX];
memset(viz, 0, (n+5)*sizeof(int));
q[0] = 1;
q[1] = 1;
viz[sursa] = 1;
for(int j = 1; j <= q[0]; j++)
{
int nod = q[j];
for(iterator it = graf[nod].begin(); it != graf[nod].end(); ++it)
{
if(!viz[*it] && flux[nod][*it] < capacitate[nod][*it])
{
viz[*it] = 1;
tata[*it] = nod;
q[ ++q[0] ] = *it;
if(*it == dest)
return 1;
}
}
}
return 0;
}
int main()
{
ifstream f(iname);
f >> n >> m;
for(int i = 0; i < m; i++)
{
int x, y, z;
f >> x >> y >> z;
capacitate[x][y] += z;
graf[x].pb(y);
graf[y].pb(x);
}
while(BF())
{
int fmin = INF;
for(int y = n; tata[y]; y = tata[y])
if(capacitate[tata[y]][y] - flux[tata[y]][y] < fmin)
fmin = capacitate[tata[y]][y] - flux[tata[y]][y];
for(int y = n; tata[y]; y = tata[y])
{
flux[tata[y]][y] += fmin;
flux[y][tata[y]] -= fmin;
}
}
int fluxMax = 0;
for(iterator it = graf[1].begin(); it != graf[1].end(); ++it)
fluxMax += flux[1][*it];
ofstream g(oname);
g << fluxMax;
return 0;
}