Pagini recente » Cod sursa (job #1647446) | Cod sursa (job #1851530) | Cod sursa (job #407449) | Cod sursa (job #3180247) | Cod sursa (job #2582399)
#include <bits/stdc++.h>
#define NMAX 1009
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int>g[NMAX];
int n,m;
void citire();
void solve();
bool bfs();
int c[NMAX][NMAX];
int f[NMAX][NMAX];
bool uz[NMAX];
int tata[NMAX];
int main()
{citire();
solve();
return 0;
}
void citire()
{int x,y;
int i;
fin>>n>>m;
for(i=1;i<=m;i++)
{int cap;
fin>>x>>y>>cap;
g[x].push_back(y);
g[y].push_back(x);
c[x][y]+=cap;
}
}
void solve()
{
int i;
int sol;
for(sol=0;bfs();)
for(i=0;i< g[n].size();i++)
{
int vec=g[n][i];
int minflow=INF;
if(c[vec][n]!=f[vec][n] && uz[vec])
{
tata[n]=vec;
for(int ct=n;ct!=1;ct=tata[ct])
minflow=min(minflow, c[tata[ct]][ct]-f[tata[ct]][ct]);
if(!minflow)
continue;
for(int ct=n;ct!=1;ct=tata[ct])
{f[tata[ct]][ct]+=minflow;
f[ct][tata[ct]]-=minflow;
}
sol+=minflow;
}
}
fout<<sol;
}
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];
}