Pagini recente » Cod sursa (job #1557716) | Cod sursa (job #441930) | Cod sursa (job #1800219) | Cod sursa (job #2463630) | Cod sursa (job #2640919)
#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
{
tata[n]=vec;
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>H;
H.push(1);
memset(uz,0, sizeof(uz));
uz[1]=1;
while(!H.empty())
{
int act=H.front();H.pop();
if(act==n) continue;
for(int i=0;i<g[act].size();i++)
{
int vec=g[act][i];
if(!uz[vec] && c[act][vec]>f[act][vec])
{
uz[vec]=1;
H.push(vec);
tata[vec]=act;
}
}
}
return uz[n];
}