Pagini recente » Cod sursa (job #2579572) | Cod sursa (job #3299333) | Cod sursa (job #1191913) | Cod sursa (job #2975369) | Cod sursa (job #2579576)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int>graph[NMAX];
queue <int>q;
int n, m, x, y, capacitate;
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int viz[NMAX];
int p[NMAX];
int bfs()
{
q.push(1);
for(int i=1; i<=n; i++)
viz[i]=0;
viz[1]=1;
while(!q.empty())
{
int vf=q.front();
q.pop();
if(vf == n)
continue;
for(auto &v:graph[vf])
{
if(c[vf][v] == f[vf][v] || viz[v])
continue;
viz[v]=1;
q.push(v);
p[v]=vf;
}
}
return viz[n];
}
int main()
{
fin>>n>>m;
int flux,fluxmin;
for(int i=1; i<=m; i++)
{
f>>x>>y>>capacitate;
graph[x].push_back(y);
graph[y].push_back(x);
c[x][y]=capacitate;
}
for(flux=0; bfs();)
{
for(auto &v:graph[n])
{
if(c[v][n] == f[v][n] || !viz[v])
continue;
p[n]=v;
fluxmin=INF;
for(int vf=n; vf!=1; vf=p[vf])
fluxmin=min(fluxmin, c[p[vf]][vf]-f[p[vf]][vf]);
if(fluxmin == 0)
continue;
for(int vf=n; vf!=1; vf=p[vf])
{
f[p[vf]][vf]+=fluxmin;
f[vf][p[vf]]-=fluxmin;
}
flux+=fluxmin;
}
}
g<<flux;
return 0;
}