Pagini recente » Cod sursa (job #2968255) | Cod sursa (job #2341844) | Cod sursa (job #1421643) | Cod sursa (job #1055966) | Cod sursa (job #316314)
Cod sursa(job #316314)
#include <iostream>
#include <memory.h>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
#define nmax 1001
int N,S,T;
vector <int> V[nmax];
int c[nmax][nmax];
int f[nmax][nmax];
int pre[nmax];
bool viz[nmax]; // TODO: bitset!!
bool bfs ()
{
memset (pre,0,(N+1)*sizeof(int));
memset (viz,0,(N+1)*sizeof(bool)); // TODO: viz.reset() !!
queue <int> Q;
Q.push (S), viz[S] = 1;
while (Q.size())
{
int x = Q.front(); Q.pop();
if (x == T) continue;
for (vector<int>::iterator i=V[x].begin(); i!=V[x].end(); ++i)
if (c[x][*i] > f[x][*i] && !viz[*i])
{
Q.push (*i); viz[*i] = 1;
pre[*i]=x;
}
}
return viz[T];
}
int getmin ()
{
int min = c[pre[T]][T] - f[pre[T]][T];
for (int i=pre[T]; i!=S; i=pre[i])
if (min > c[pre[i]][i] - f[pre[i]][i])
min = c[pre[i]][i] - f[pre[i]][i];
return min;
}
int flux ()
{
int flux = 0;
while (bfs())
{
for (vector<int>::iterator i=V[T].begin(); i!=V[T].end(); ++i)
if (c[*i][T] > f[*i][T] && viz[*i])
{
pre[T] = *i;
int cf = getmin ();
if (!cf) continue;
for (int i=T; i!=S; i=pre[i])
{
f[pre[i]][i] += cf;
f[i][pre[i]] -= cf;
}
flux += cf;
}
}
return flux;
}
void read ()
{
int M;
cin>>N>>M;
while (M--)
{
int x,y,z;
cin>>x>>y>>z;
c[x][y]+=z;
V[x].push_back(y),V[y].push_back(x);
}
}
int main ()
{
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
read (); S=1, T=N;
cout<<flux()<<'\n';
return 0;
}