Pagini recente » Cod sursa (job #207829) | Cod sursa (job #2119914) | Concursuri organizate de infoarena | apmtraining | Cod sursa (job #414976)
Cod sursa(job #414976)
#include <stdio.h>
#include <vector>
#include <deque>
using namespace std;
const int Lg = 1005;
vector <int> V[Lg];
int Flux[Lg][Lg] ,Cap[Lg][Lg];
int n,m,viz[Lg],tati[Lg],st[Lg];
void citire ()
{
int a,b,c;
scanf ("%d %d",&n,&m);
for (int i=0;i<m;i++)
{
scanf ("%d %d %d",&a,&b,&c);
Cap[a][b]=c;
V[a].push_back(b);
V[b].push_back(a);
}
}
bool df()
{
for (int i=1;i<=n;i++)
tati[i]=0;
tati[1]=-1;
st[1]=1;
int nr=2;
for (int i=1;i<nr;i++)
for (int j=0;j<V[st[i]].size();j++)
{
if (tati[V[st[i]][j]] || Cap[st[i]][V[st[i]][j]]<=Flux[st[i]][V[st[i]][j]])
continue;
tati[V[st[i]][j]]=st[i];
st[nr++]=V[st[i]][j];
if (V[st[i]][j]==n)
return true;
}
return false;
}
void solve()
{
int flux=0;
while (df()==true)
{
for (int i=1;i<=n;i++)
{
if (!tati[i] || Cap[i][n]<=Flux[i][n])
continue;
int fl=Cap[i][n]-Flux[i][n];
int nod=i;
while(nod!=1)
{
if (fl>Cap[tati[nod]][nod]-Flux[tati[nod]][nod])
fl=Cap[tati[nod]][nod]-Flux[tati[nod]][nod];
nod=tati[nod];
}
if (!fl)
continue;
flux+=fl;
Flux[i][n]+=fl;
Flux[n][i]-=fl;
nod=i;
while (nod!=1)
{
Flux[tati[nod]][nod]+=fl;
Flux[nod][tati[nod]]-=fl;
nod=tati[nod];
}
}
}
printf("%d\n",flux);
}
int main ()
{
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
citire();
solve();
return 0;
}