Pagini recente » Cod sursa (job #2314354) | Istoria paginii utilizator/anaturcitu | Cod sursa (job #966700) | Cod sursa (job #2586404) | Cod sursa (job #2640915)
#include <bits/stdc++.h>
#define NMAX 1009
#define INF 9999999
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
void citire();
void solve();
bool bfs();
int c[NMAX][NMAX];
int f[NMAX][NMAX];
bool uz[NMAX];
int tata[NMAX];
int n,m;
vector<int> g[NMAX];
int main()
{citire();
solve();
return 0;
}
void citire()
{
int i;
int x,y,cap;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y>>cap;
g[x].push_back(y);
g[y].push_back(x);
c[x][y]+=cap;
}
}
void solve()
{
int i,rez=0,j;
for(;bfs();)
{
///inseamna ca am gasit drum si se poate mari fluxul
///o luam de la destinatie
for(i=0;i< g[n].size();i++)
{
int vec=g[n][i];
int minflow=INF;
if(c[vec][n]!= f[vec][n] && uz[n])///am trecut
{
for(j=n;j!=1;j=tata[j])
minflow=min(minflow, c[ tata[j]][j]-f[ tata[j]][j]);
if(!minflow)
continue;
for(j=n;j!=1;j=tata[j])
{
f[ tata[j] ][j]+=minflow;
f[j][tata[j]]-=minflow;
}
rez+=minflow;
}
}
}
fout<<rez;
}
bool bfs()
{
queue<int>Q;
memset(uz,0,sizeof(uz));
uz[1]=1;
Q.push(1);
while( !Q.empty())
{
int act=Q.front();Q.pop();
int i;
if(act==n)
continue;
for(i=0;i< g[act].size();i++)
{
int vec=g[act][i];
if(!uz[vec] && f[act][vec]<c[act][vec])
{
uz[vec]=1;
Q.push(vec);
tata[vec]=act;
}
}
}
return uz[n];
}