Pagini recente » Cod sursa (job #63080) | Cod sursa (job #251740) | Cod sursa (job #2309145) | Cod sursa (job #2150481) | Cod sursa (job #1191079)
#include <iostream>
#include <fstream>
#include <algorithm>
#define pinf 100000000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int N,M;
int capacitate[1005][1005],flux[1005][1005];
int lant[1005],q[1009],viz[1005];
int pq,nq;
struct nod
{
int val;
nod *next;
};
nod *p,*l[1005];
void citire(int &N, int &M)
{
int x,y,capac;
f>>N>>M;
for(int i=1;i<=M;i++)
{
p=new nod;
f>>x>>y>>capac;
p->val=y;
p->next=l[x];
l[x]=p;
capacitate[x][y]=capac;
}
}
int bf(int s, int t)
{int x;
for(int i=1;i<=N;i++)
{
viz[i]=-1;
q[i]=0;
}
pq=nq=1;
q[pq]=s;
viz[s]=0;
lant[s]=-1;
while (pq<=nq)
{
x=q[pq];
viz[x]=1;
for(p=l[x];p;p=p->next)
{
if(viz[p->val]==-1 && capacitate[x][p->val]-flux[x][p->val]>0)
{
q[++nq]=p->val;
viz[p->val]=0;
lant[p->val]=x;
}
}
pq++;
}
if(viz[t]==1) return 1;
return 0;
}
int Ford(int s, int t)
{
int i;
int fluxmaxim=0;
while (bf(s,t))
{
int x=pinf;
for (i=N;lant[i]>0;i=lant[i])
x=min(x,capacitate[lant[i]][i]-flux[lant[i]][i]);
for (i=N;lant[i]>0;i=lant[i])
{
flux[lant[i]][i]+=x;
flux[i][lant[i]]-=x;
}
fluxmaxim+=x;
}
return fluxmaxim;
}
int main()
{
citire(N,M);
g<<Ford(1,N);
return 0;
}