Pagini recente » Cod sursa (job #3261896) | Cod sursa (job #1722922) | Cod sursa (job #246296) | Cod sursa (job #3000212) | Cod sursa (job #3221400)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int nmax = 1e3;
const int oo = INT_MAX;
int n,m;
vector<int> G[nmax + 5];
int s, d;
int c[nmax + 5][nmax + 5], f[nmax + 5][nmax + 5];
int lvl[nmax + 5];
int poz[nmax + 5];
bool bfs()
{
for(int i=1; i<=n; i++)
{
lvl[i] = -1;
}
queue<int> q;
lvl[s] = 0;
q.push(s);
while(!q.empty())
{
int nod = q.front();
q.pop();
for(auto it : G[nod])
{
if(lvl[it] == -1 && c[nod][it] > f[nod][it])
{
lvl[it] = 1 + lvl[nod];
q.push(it);
}
}
}
return (lvl[d] != -1);
}
int dfs(int nod, int Min)
{
if(!Min)
{
return 0;
}
if(nod == d)
{
return Min;
}
while(poz[nod] < G[nod].size())
{
int it = G[nod][poz[nod]];
if(lvl[it] != lvl[nod] + 1 || c[nod][it] == f[nod][it])
{
++poz[nod];
continue;
}
int add = dfs(it, min(Min, c[nod][it] - f[nod][it]));
if(add)
{
f[nod][it] += add;
f[it][nod] -= add;
return add;
}
++poz[nod];
}
return 0;
}
int max_flow()
{
int flux = 0;
while(bfs())
{
for(int i=1; i<=n; i++)
{
poz[i] = 0;
}
int add = 0;
while(true)
{
add = dfs(s, oo);
if(add == 0)
{
break;
}
flux += add;
}
}
return flux;
}
int main()
{
fin>>n>>m;
s = 1, d = n;
for(int i=1; i<=m; i++)
{
int x,y,cap;
fin>>x>>y>>cap;
if(!c[y][x])
{
G[x].push_back(y);
G[y].push_back(x);
}
c[x][y] = cap;
}
fout<<max_flow()<<'\n';
return 0;
}