Pagini recente » Cod sursa (job #1044323) | Cod sursa (job #225772) | Cod sursa (job #2459901) | Cod sursa (job #2748736) | Cod sursa (job #674869)
Cod sursa(job #674869)
#include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
#define pb push_back
#define Nmax 1009
#define inf 0x3f3f3f3f
using namespace std;
int nod,x,y,n,m,i,z,S,C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax],ok[Nmax];
vector<int> a[Nmax];
vector<int>::iterator it;
int BF()
{
queue<int> Q;
Q.push(1);
memset(ok,0,sizeof(ok));
ok[1]=1;
while (!Q.empty())
{
nod=Q.front();
Q.pop();
for (it=a[nod].begin();it!=a[nod].end();it++)
if (!ok[*it] && C[nod][*it]>F[nod][*it])
{
ok[*it]=1;
if (*it==n) continue;
Q.push(*it);
T[*it]=nod;
}
}
return ok[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[x].pb(y);
a[y].pb(x);
C[x][y]=z;
}
while (BF())
for (it=a[n].begin();it!=a[n].end();it++)
{
x=inf;
nod=*it;
T[n]=nod;
for (nod=n;nod!=1;nod=T[nod])
x=min(x,C[T[nod]][nod]-F[T[nod]][nod]);
if (!x) continue;
for (nod=n;nod!=1;nod=T[nod])
{
F[T[nod]][nod]+=x;
F[nod][T[nod]]-=x;
}
S+=x;
}
printf("%d\n",S);
}