Pagini recente » Cod sursa (job #619360) | Cod sursa (job #820562) | Cod sursa (job #1400260) | Cod sursa (job #1420361) | Cod sursa (job #513470)
Cod sursa(job #513470)
// infoarena: problema/maxflow //
#include <fstream>
#include <queue>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 1010;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int f[MAXN][MAXN],c[MAXN][MAXN],i,j,n,m,a,b,s,d,t[MAXN],r,flux,e,vn[MAXN];
vector<int> g[MAXN];
deque<int> q;
vector<int>::iterator it, fin;
inline int bf()
{
memset(t, 0, sizeof(t[0]) * (n+1));
q.resize(0);
q.push_back(s);
int nod,v,ok=0;
while(!q.empty())
{
nod = q.front(); q.pop_front();
fin = g[nod].end();
for(it = g[nod].begin(); it!=fin; ++it)
{
v = *it;
if(!t[v] && c[nod][v] > f[nod][v])
{
t[v] = nod, q.push_back(v);
if(v == d)
ok = 1;
}
}
}
return ok;
}
int main()
{
in>>n>>m;
for(i=1; i<=m; i++)
{
in>>a>>b;
in>>c[a][b];
g[a].push_back(b);
g[b].push_back(a);
if(b == n)
vn[++vn[0]] = a;
}
s=1, d=n;
while(bf())
for(j=1; j<=vn[0]; j++)
{
e = vn[j];
r = c[e][n] - f[e][n];
for(i=e; i!=s && i; i=t[i])
r = min(r, c[t[i]][i] - f[t[i]][i]);
for(i=e; i!=s && i; i=t[i])
{
f[t[i]][i] += r;
f[i][t[i]] -= r;
}
flux += r;
}
out<<flux;
return 0;
}