Pagini recente » Cod sursa (job #1291152) | Cod sursa (job #1603655) | Cod sursa (job #1172292) | Cod sursa (job #1531629) | Cod sursa (job #891640)
Cod sursa(job #891640)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 1024
using namespace std;
vector<int> G[NMAX];
int n,m,C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX],cd[NMAX];
bool viz[NMAX];
int bf()
{
int i, j, nod, V;
cd[0] = 1;
cd[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for (i = 1; i <= cd[0]; i++)
{
nod = cd[i];
if (nod == n) continue;
for (j = 0; j < G[nod].size(); j++)
{
V = G[nod][j];
if (C[nod][V] == F[nod][V] || viz[V]) continue;
viz[V] = 1;
cd[ ++cd[0] ] = V;
T[V] = nod;
}
}
return viz[n];
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>n>>m;
int x,y,z,flow,fmin;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
C[x][y]+=z;
G[x].push_back(y);
G[y].push_back(x);
}
flow=0;
for(flow=0;bf();)
{
for(int i=0;i<G[n].size();i++)
{
int nod=G[n][i];
if(F[nod][n]==C[nod][n] || !viz[nod]) continue;
T[n]=nod;
fmin=INF;
for(nod=n; nod!=1; nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if(fmin == 0) continue;
for (nod = n; nod != 1; nod = T[nod])
{
F[ T[nod] ][nod] += fmin;
F[nod][ T[nod] ] -= fmin;
}
flow+=fmin;
}
}
fout<<flow;
return 0;
}