Pagini recente » Cod sursa (job #1093392) | Cod sursa (job #1699226) | Cod sursa (job #1001228) | Istoria paginii runda/oji_sim_ms/clasament | Cod sursa (job #2290673)
#include <bits/stdc++.h>
#define NMAX 1001
#define MMAX 5001
#define mp make_pair
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, G[NMAX][NMAX],f[NMAX][NMAX], max_flow, flow;
bool viz[NMAX];
queue < int > q;
vector <int> v[NMAX];
int mymap[NMAX];
bool BF()
{
while(!q.empty())
q.pop();
for(int i = 0; i <= n; i++)
viz[i] = 0;
// memset(mymap, 0, sizeof(mymap));
q.push(1);
viz[1] = 1;
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n)
continue;
for(int i = 0; i < v[nod].size(); i++)
{
int next = v[nod][i];
if(G[nod][next]!=f[nod][next] && !viz[next])
{
q.push(next);
viz[next] = 1;
mymap[next] = nod;
}
}
}
return viz[n];
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
int a, b, c;
fin >> a >> b >> c;
G[a][b] = c;
v[a].push_back(b);
v[b].push_back(a);
}
bool ok = false;
while(BF())
{
for(int i = 0; i < v[n].size(); i++)
{
int nod = v[n][i];
if(G[nod][n] == f[nod][n] || viz[nod]==0) continue;
mymap[n] = nod;
int add = (1<<30);
for(int nod = n; nod != 1; nod = mymap[nod])
add = min(add, G[mymap[nod]][nod] - f[mymap[nod]][nod]);
nod = n;
for(int nod = n; nod != 1; nod = mymap[nod])
{
f[mymap[nod]][nod] += add;
f[nod][mymap[nod]] -= add;
}
max_flow += add;
}
}
fout << max_flow;
return 0;
}