Pagini recente » Cod sursa (job #941703) | Cod sursa (job #1012909) | Cod sursa (job #218243) | Cod sursa (job #870708) | Cod sursa (job #475701)
Cod sursa(job #475701)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1025
using namespace std;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";
ifstream fin(iname);
ofstream fout(oname);
vector<int> nod[nmax];
queue<int> Q;
int N, M, i, a, b, c, Cap[nmax][nmax], x, F[nmax][nmax], fmin, flow, y, tata[nmax], viz[nmax];
int BFS()
{
Q.push(1);
memset(viz, 0, sizeof(viz));
while(!Q.empty())
{
x = Q.front();
Q.pop();
if(x == N)
continue;
for(vector<int>::iterator it = nod[x].begin(); it != nod[x].end(); ++it)
{
if(F[x][*it] == Cap[x][*it] || viz[*it])
continue;
Q.push(*it);
viz[*it] = 1;
tata[*it] = x;
}
}
return viz[N];
}
int main()
{
fin >> N >> M;
for(i = 1; i <= M; i ++)
{
fin >> a >> b >> c;
nod[a].push_back(b);
nod[b].push_back(a);
Cap[a][b] = c;
}
for(flow = 0; BFS();)
{
for(vector<int>::iterator it = nod[N].begin(); it != nod[N].end(); ++ it)
{
if(F[*it][N] == Cap[*it][N] || !viz[*it])
continue;
tata[N] = *it;
fmin = 287185781;
for(y = N; y != 1; y = tata[y])
fmin = min(fmin, Cap[tata[y]][y] - F[tata[y]][y]);
for(y = N; y != 1; y = tata[y])
{
F[tata[y]][y] += fmin;
F[y][tata[y]] -= fmin;
}
flow += fmin;
}
}
fout << flow;
return 0;
}