Pagini recente » Cod sursa (job #760623) | Cod sursa (job #2908406) | Cod sursa (job #3272047) | Cod sursa (job #1689508) | Cod sursa (job #581163)
Cod sursa(job #581163)
#include <cstdio>
#define NMax 1001
#define oo 2000000000
#define min(a,b) (a<b?a:b)
using namespace std;
FILE *fin=fopen("maxflow.in","r"),*fout=fopen("maxflow.out","w");
int cap[NMax][NMax],flux[NMax][NMax],t[NMax],n;
void Citire()
{
int m,x,y,c;
fscanf(fin,"%d %d",&n,&m);
while(m--)
{
fscanf(fin,"%d%d%d",&x,&y,&c);
cap[x][y]=c;
}
}
int bfs(int source,int sink)
{
int Q[NMax],p=0,u=0,x,i;
for(i=1;i<=sink;i++) t[i]=0;
Q[0]=source;
while(p<=u)
{
x=Q[p++];
for(i=source;i<=sink;i++)//pt toti succesori lui x
if(!t[i]&&i!=source)
if(cap[x][i]-flux[x][i]>0)
{
Q[++u]=i;
t[i]=x;
}
}
if(t[sink]) return 1;
return 0;
}
int dinic(int source,int sink)
{
int i,j,flow=0,MIN;
while(bfs(source,sink))
{
for(j=source;j<sink;j++)
if(cap[j][sink]-flux[j][sink]>0)
{
MIN=oo;
MIN=min(MIN,cap[j][sink]-flux[j][sink]);
for(i=j;i!=source;i=t[i])//gasesc minimul
MIN=min(MIN,cap[ t[i] ][i]-flux[ t[i] ][i]);
if(MIN==oo)//nu avem flux pe portiunea aceasta
continue;
flux[j][sink]+=MIN;
flux[sink][j]-=MIN;
for(i=j;i!=source;i=t[i])
flux[ t[i] ][i]+=MIN,//adun flux pe muchiile directe
flux[i][ t[i] ]-=MIN;//scad flux pe muchiile inverse
flow+=MIN;//adaugam minimul la flux
}
}
return flow;
}
int main()
{
Citire();
fprintf(fout,"%d",dinic(1,n));
return 0;
}