Pagini recente » Cod sursa (job #702436) | Cod sursa (job #63212) | Cod sursa (job #652003) | Cod sursa (job #375706) | Cod sursa (job #676475)
Cod sursa(job #676475)
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
#define MAXN 1005
class muchie
{
public:
muchie(): dest(0), cap(0), flux(0), indice(0){};
muchie(int destS, int capS, int fluxS, int indiceS):
dest(destS),
cap(capS),
flux(fluxS),
indice(indiceS)
{}
int dest, cap, flux, indice;
//indice e folosit doar daca cap < 0 si indica indicele lui THIS in graf[dest]
};
vector<muchie> muchii[MAXN];
typedef vector<muchie>::iterator iter;
pair<int, iter> parinte[MAXN];
int n, m;
muchie muchieReala(muchie muc)
{
return muchii[muc.dest][muc.indice];
}
void dfs(int nod)
{
if(nod == n)
{
int minDif = 110001,aux;
muchie auxM;
while(nod != 1)
{
if(parinte[nod].first >= 0)
{
auxM = *(parinte[nod].second);
aux = auxM.cap - auxM.flux;
nod = parinte[nod].first;
}
else
{
auxM = muchieReala(*(parinte[nod].second));
aux = auxM.flux;
nod = -parinte[nod].first;
}
if(aux < minDif)
minDif =aux;
}
nod = n;
while(nod != 1)
{
if(parinte[nod].first >= 0)
{
(*(parinte[nod].second)).flux += minDif;
nod = parinte[nod].first;
}
else
{
(muchieReala(*(parinte[nod].second))).flux -= minDif;
nod = -parinte[nod].first;
}
}
return;
}
iter it;
for(it = muchii[nod].begin(); it != muchii[nod].end(); it++)
{
if(parinte[(*it).dest].first)
{
continue;
}
if((*it).cap < 0)
{
if(muchieReala(*it).flux != 0)
{
parinte[(*it).dest].first = -nod;
parinte[(*it).dest].second= it;
dfs((*it).dest);
parinte[(*it).dest].first = 0;
}
}
else
{
if((*it).flux != (*it).cap)
{
parinte[(*it).dest].first = nod;
parinte[(*it).dest].second= it;
dfs((*it).dest);
parinte[(*it).dest].first = 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);
muchii[nod1].push_back(muchie(nod2, capacitate, 0, 0));
muchii[nod2].push_back(muchie(nod1, -capacitate,0, muchii[nod1].size() - 1));
}
int fluxMax = 0;
parinte[1].first = -1;
dfs(1);
iter it;
for(it = muchii[1].begin(); it != muchii[1].end(); it++)
{
fluxMax += (*it).flux;
}
fprintf(out,"%i", fluxMax);
}