Pagini recente » Cod sursa (job #3187521) | Cod sursa (job #1987240) | Cod sursa (job #3199311) | Cod sursa (job #737753) | Cod sursa (job #676452)
Cod sursa(job #676452)
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
#define MAXN 1005
class muchie
{
muchie(int destS, int capS, int fluxS): dest(destS), cap(capS), flux(fluxS){}
int dest,cap,flux;
};
int mat[MAXN][MAXN];
int flux[MAXN][MAXN];
typedef vector<muchie>::iterator iter;
int parinte[MAXN];
int n, m;
void dfs(int nod)
{
/*
iter it;
for(it = muchii[nod].begin(); it != muchii[nod].end(); it++)
{
if(parinte[(*it).dest])
{
continue;
}
if((*it).cap < 0)
{
if((*it).flux != 0)
{
parinte[*it] = -nod;
parinte[*it] = 0;
}
}
else
{
}
}*/
if(nod == n)
{
int minDif = 110001,aux;
while(nod != 1)
{
if(parinte[nod] >= 0)
{
aux = mat[parinte[nod]][nod] - flux[parinte[nod]][nod];
nod = parinte[nod];
}
else
{
aux = flux[nod][-parinte[nod]];
nod = -parinte[nod];
}
if(aux < minDif)
minDif =aux;
}
nod = n;
while(nod != 1)
{
if(parinte[nod] >= 0)
{
flux[parinte[nod]][nod] += minDif;
nod = parinte[nod];
}
else
{
flux[nod][-parinte[nod]] -= minDif;
nod = -parinte[nod];
}
}
}
int i;
for(i = 1; i <= n; i++)
{
if(parinte[i] != 0)
continue;
if(mat[nod][i] && flux[nod][i] != mat[nod][i])
{
parinte[i] = nod;
dfs(i);
parinte[i] = 0;
}
if(mat[i][nod] && flux[i][nod])
{
parinte[i] = -nod;
dfs(i);
parinte[i] = 0;
}
}
}
int main()
{
FILE *in = fopen("maxflow.in", "r");
FILE *out= fopen("maxflow.out","w");
fscanf(in, "%i %i", &n, &m);
int i, nod1, nod2, capacitate;
for(i = 1; i <= m; i++)
{
fscanf(in, "%i %i %i", &nod1, &nod2, &capacitate);
mat[nod1][nod2] = capacitate;
}
int fluxMax = 0;
dfs(1);
for(i = 2; i <= n; i++)
{
fluxMax += flux[1][i];
}
fprintf(out,"%i", fluxMax);
}