Pagini recente » Cod sursa (job #1901762) | Cod sursa (job #1621486) | Cod sursa (job #3125287) | Cod sursa (job #3237432) | Cod sursa (job #420234)
Cod sursa(job #420234)
#include<fstream>
#include<cstdio>
#include<vector>
#define MAX 1004
#define pb push_back
#define INFI 1000000000
using namespace std;
int cap[MAX][MAX], p[MAX], nrp,fluxmax,n, t[MAX];
void citire()
{
int m,i;
ifstream fin("maxflow.in");
fin>>n>>m;
for(i=1;i<=m;i++)
{
int x,y,z;
fin>>x>>y>>z;
cap[x][y]=z;
if(y==n)
p[++nrp]=x;
}
}
int bfs(int start, int end)
{
int st,dr,j,k;
vector<int> coada;
coada.pb(start);
st=dr=0;
for(j=1;j<=n;j++)
t[j]=-1;
t[start]=0;
while(st<=dr)
{
k=coada[st++];
if(k==end)
return 1;
for(j=1;j<=n;j++)
if(t[j]==-1 && cap[k][j])
{
coada.pb(j);
dr++;
t[j]=k;
}
}
coada.clear();
return t[n]>-1;
}
void edm_karp()
{
int cmin,v,k;
while(bfs(1,n))
for(int i=1;i<=nrp;i++)
if(t[p[i]]!=-1 && cap[p[i]][n])
{
cmin=INFI;
t[n]=p[i];
for(k=n, v=t[n] ; t[k]; k=t[k], v=t[v])
if(cap[v][k]<cmin)
cmin=cap[v][k];
fluxmax+=cmin;
for(k=n, v=t[n] ; t[k]; k=t[k], v=t[v])
{
cap[v][k]-=cmin;
cap[k][v]+=cmin;
}
}
}
int main()
{
freopen("maxflow.out","w",stdout);
citire();
edm_karp();
printf("%d", fluxmax);
return 0;
}