Pagini recente » Cod sursa (job #1700162) | Cod sursa (job #2404366) | Cod sursa (job #1103807) | Cod sursa (job #3247481) | Cod sursa (job #1842114)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1000
#define MMAX 5000
const int INF = 0x7fffffff;
int N,M,flux=0, fluxminim, nod;
int c[NMAX+1][NMAX+1];
int f[NMAX+1][NMAX+1];
int tata[NMAX+1];
char vizitat[NMAX+1];
vector <int> muchie[NMAX+1];
FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");
int minim(int a, int b)
{
if(a<b) return a;
return b;
}
int bfs()
{
for(int i=1;i<=N;i++)
{
vizitat[i]=0;
}
queue <int> frontiera;
frontiera.push(1);
vizitat[1]=1;
while(!frontiera.empty())
{
int nod = frontiera.front();
frontiera.pop();
if(nod == N) continue;
for(auto m : muchie[nod])
{
if(c[nod][m] == f[nod][m] || vizitat[m]==1) continue;
tata[m] = nod;
vizitat[m] = 1;
frontiera.push(m);
}
}
return vizitat[N];
}
int main()
{
fscanf(fin, "%d%d", &N, &M);
for(int i=1;i<=M;i++)
{
int x,y,z;
fscanf(fin , "%d%d%d", &x, &y, &z);
c[x][y]=z;
muchie[x].push_back(y);
muchie[y].push_back(x);
}
while(bfs())
{
for(auto m : muchie[N])
{
if(c[m][N] == f[m][N] || vizitat[m]==0 ) continue;
tata[N] = m;
fluxminim = INF;
nod = N;
while(nod != 1)
{
fluxminim = minim(fluxminim , c[tata[nod]][nod]-f[tata[nod]][nod]);
nod = tata[nod];
}
if(fluxminim == 0) continue;
nod = N;
while(nod!=1)
{
f[tata[nod]][nod] += fluxminim;
f[nod][tata[nod]] -= fluxminim;
nod = tata[nod];
}
flux += fluxminim;
}
}
fprintf(fout, "%d", flux);
return 0;
}