Pagini recente » Cod sursa (job #2816108) | Cod sursa (job #2498845) | Cod sursa (job #272352) | Cod sursa (job #657489) | Cod sursa (job #641052)
Cod sursa(job #641052)
#include<fstream>
#include<cstdio>
using namespace std;
int cap[1001][1001],flux[1001][1001],l[1001];//l=land de la destinatie la sursa
int n,m,x,y,c,i;
short viz[1002];
ofstream g("maxflow.out");
int abs(int nr)
{
if(nr>-1)return nr;
return -nr;
}
int minim(int a,int b)
{
if(a<b)return a;
return b;
}
int bfs(int s,int d)
{int u=1,p=1,nd=s,i,c[1001];//nodul sursa = 1
c[1]=s; viz[s]=1;
while(p<=u && !viz[d])
{
for(i=1;i<=n;i++)
if(!viz[i])//daca am muchie de la nd la i
if(cap[nd][i]>flux[nd][i])
{
c[++u]=i; viz[i]=nd;
}
else
if(flux[i][nd]>0)
{
c[++u]=i; viz[i]=-nd;//avem arc saturat
}
nd=c[++p];
}
return viz[d];//daca nu e vizitat fluxul este maxim
}
void ek(int s,int d)
{int a=110001,b=110001,minn,k,fluxmax=0;//maresc fluxul cu minimul lui a
while(bfs(s,d))
{
k=0; l[k]=d;
while(l[k]!=s)
{
k++;
l[k]=abs(viz[l[k-1]]);//introdul in land nodul care intra in nodul curent
if(viz[l[k-1]]>0)
if(cap[l[k]][l[k-1]]>flux[l[k]][l[k-1]])
a=minim(a,cap[l[k]][l[k-1]]-flux[l[k]][l[k-1]]);//minimul de marire de flux
else
if(viz[l[k-1]]<0)b=min(b,flux[l[k-1]][l[k]]);
}
minn=minim(a,b);
for(k;k>0;k--)
if(viz[l[k-1]]>0)
flux[l[k]][l[k-1]]+=minn;
else
flux[l[k-1]][l[k]]-=minn;
for(i=1;i<=n;i++)viz[i]=0;
}
for(i=1;i<=n;i++) fluxmax+=flux[i][n];
g<<fluxmax;
}
int main()
{
freopen("maxflow.in","r",stdin);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&c);
cap[x][y]=c;
}
ek(1,n);//edmonds-karp
g.close();
return 0;}