Pagini recente » Cod sursa (job #690951) | Cod sursa (job #709307) | Cod sursa (job #2884224) | Cod sursa (job #43032) | Cod sursa (job #2125609)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1024
using namespace std;
const int INF = 2e9;
int N, M;
int cost[NMAX][NMAX];
int flux[NMAX][NMAX];
int vizitat[NMAX];
int precedent[NMAX];
vector <int> G [NMAX];
queue <int> Q;
void clear_q()
{
while (!Q.empty())
Q.pop();
return;
}
int BEFEU ()
{
clear_q();
for(int i = 0; i < NMAX; ++i)
vizitat[i] = 0;
vizitat[1] = 1;
Q.push(1);
while(!Q.empty())
{
int nod = Q.front();
Q.pop();
for(int j = 0; j < G[nod].size(); ++j)
{
int vecin = G[nod][j];
if(cost[nod][vecin] == flux[nod][vecin] || vizitat[vecin])
continue;
vizitat[vecin] = 1;
precedent[vecin] = nod;
Q.push(vecin);
//if(vecin == N) ///am ajuns la sink
//return 1;
}
}
return vizitat[N];
}
int main()
{
ifstream in ("maxflow.in");
ofstream out ("maxflow.out");
in>>N>>M;
int x, y, z, nod;
int flow, fmin;
for (int i = 1; i <= M; i++)
{
in>>x>>y>>z;
cost[x][y] += z;
G[x].push_back(y); ///muchia in graful normal
G[y].push_back(x); ///muchia in graful rezidual
}
flow = 0;
while(BEFEU())
for (int i = 0; i < G[N].size(); ++i)
{
nod = G[N][i];
if (flux[nod][N] == cost[nod][N] || !vizitat[nod])
continue;
precedent[N] = nod;
//cout<<"1\n";
fmin = INF;
for (nod = N; nod != 1; nod = precedent[nod])
{
fmin = min(fmin, cost[precedent[nod]][nod] - flux[precedent[nod]][nod]); ///gasim bottleneckul
//cout<<fmin<<"\n";
}
for (nod = N; nod != 1; nod = precedent[nod])
{
flux[precedent[nod]][nod] += fmin;
flux[nod][precedent[nod]] -= fmin;
//cout<<"PLM!\n";
}
flow += fmin;
}
out<<flow;
return 0;
}