Pagini recente » Cod sursa (job #1040200) | Cod sursa (job #1094191) | Cod sursa (job #2774549) | Cod sursa (job #2843455) | Cod sursa (job #2092783)
#include<bits/stdc++.h>
#define NMAX 1024
#define INF 1000000000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int C[NMAX][NMAX],flow,F[NMAX][NMAX],TT[NMAX];
/// C - Capacitatea
/// F - Fluxul
/// F[i][j]<=C[i][j]
/// TT - Tatal
vector<int>v[NMAX];
int N,M,cd[NMAX]; /// cd - coada
bool viz[NMAX]; /// vizitatii
int bfs()
{
cd[0]=cd[1]=1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (int i=1;i<=cd[0];i++)
{
int nod = cd[i];
if (nod == N)
continue;
for (int j = 0; j < v[nod].size(); j++)
{
int V = v[nod][j];
if (C[nod][V] == F[nod][V] || viz[V])
continue;
viz[V] = 1;
cd[++cd[0]] = V;
TT[V] = nod;
}
}
return viz[N];
}
int main()
{
f>>N>>M;
for (int i=1;i<=M;++i)
{
int x,y,z;
f>>x>>y>>z;
C[x][y]+=z;
v[x].push_back(y);
v[y].push_back(x);
}
for (flow = 0; bfs();)
for (int i=0;i<v[N].size();i++)
{
int nod=v[N][i];
if (F[nod][N] == C[nod][N] || !viz[nod])
continue;
TT[N] = nod;
int fmin = INF;
for (nod = N; nod != 1; nod=TT[nod])
{
int R=TT[nod];
fmin=min(fmin,C[R][nod]-F[R][nod]);
}
if (fmin == 0)
continue;
for (nod = N; nod != 1; nod = TT[nod])
{
int R=TT[nod];
F[R][nod]+=fmin;
F[nod][R]-=fmin;
}
flow+=fmin;
}
g<<flow;
return 0;
}