Pagini recente » Borderou de evaluare (job #421415) | Cod sursa (job #1237456) | Cod sursa (job #3228401) | Cod sursa (job #1934221)
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1005
#define inf 2000000000
using namespace std;
int n, m;
vector <int> G[nmax];
vector <bool> viz(nmax);
int tata[nmax];
int f[nmax][nmax], c[nmax][nmax];
void read()
{
ifstream f("maxflow.in");
f >> n >> m;
for(int i=0, x, y, cost; i<m; ++i)
{
f >> x >> y >> cost;
c[x][y] = cost;
G[x].push_back(y);
G[y].push_back(x);
}
f.close();
}
int bfs()
{
for(int i=0; i<=n; ++i)
viz[i] = 0;
queue <int> q;
q.push(1);
viz[1] = true;
while(q.size())
{
int nod = q.front(); q.pop();
for(int i=0; i<G[nod].size(); ++i)
{
int fiu = G[nod][i];
if(c[nod][fiu] == f[nod][fiu] || viz[fiu])
continue;
viz[fiu] = true;
q.push(fiu);
tata[fiu] = nod;
if(fiu == n)
return 1;
}
}
return 0;
}
void solve()
{
int flow=0, fmin;
for( ; bfs(); )
{
for(int i=0; i<G[n].size(); ++i)
{
int nod = G[n][i];
if(c[nod][n] == f[nod][n] || !viz[nod])
continue;
tata[n] = nod;
fmin = inf;
for(nod = n; nod != 1; nod = tata[nod])
fmin = min(c[tata[nod]][nod] - f[tata[nod]][nod], fmin);
for(nod = n; nod != 1; nod = tata[nod])
{
f[tata[nod]][nod] += fmin;
f[nod][tata[nod]] -= fmin;
}
flow += fmin;
}
}
ofstream g("maxflow.out");
g << flow << '\n';
g.close();
}
int main()
{
read();
solve();
return 0;
}