Pagini recente » Cod sursa (job #2918855) | Cod sursa (job #1925449) | Cod sursa (job #1668582) | Cod sursa (job #968950) | Cod sursa (job #302958)
Cod sursa(job #302958)
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#define nx 355
#define mx 1000000
#define inf 2000000000
int cap[nx][nx],flux[nx][nx],drum;
int n,m,tat[nx],a[nx][nx],cost[nx][nx],d[nx],Q[mx],S,D,inQ[nx];
inline int min(int a,int b)
{
if (a<b) return a;
return b;
}
int bf ()
{
int i,w,r,st,dr;
for (i=1;i<=n;++i)
{d[i]=inf;
tat[i]=-1;
inQ[i]=0;}
Q[1]=S;d[S]=0;inQ[S]=1;
st=dr=1;
while (st<=dr)
{
r=Q[st++];
inQ[r]=0;
for (i=1;i<=a[r][0];++i)
if (cap[r][a[r][i]]>flux[r][a[r][i]] && d[a[r][i]]>d[r]+cost[r][a[r][i]])
{
d[a[r][i]]=d[r]+cost[r][a[r][i]];
tat[a[r][i]]=r;
if (!inQ[a[r][i]])
{
inQ[a[r][i]]=1;
Q[++dr]=a[r][i];
}
}
}
if (d[D]!=inf)
{
drum=1;
r=inf;
for (i=D;i!=S;i=tat[i])
r=min(r,cap[tat[i]][i]-flux[tat[i]][i]);
for (i=D;i!=S;i=tat[i])
{
flux[tat[i]][i]+=r;
flux[i][tat[i]]-=r;
}
return d[D]*r;
}
return 0;
}
long fluxx()
{
long rez=0;drum=1;
while (drum)
{
drum=0;
rez+=bf();
}
return rez;
}
int main()
{
ifstream be ("maxflow.in");
ofstream ki ("maxflow.out");
be>>n>>m>>S>>D;
int i,x,y,z,c;
/* for (i=1;i<=n;++i)
{
a[i]=(int*)realloc(a[i],sizeof(int));
a[i][0]=0;
}*/
for (i=1;i<=m;++i)
{
be>>x>>y>>z>>c;
cap[x][y]=z;
cost[x][y]=c;
cost[y][x]=-c;
a[x][0]++;
// a[x]=(int*)realloc(a[x],(a[x][0]+1)*sizeof(int));
a[x][a[x][0]]=y;
a[y][0]++;
// a[y]=(int*)realloc(a[y],(a[y][0]+1)*sizeof(int));
a[y][a[y][0]]=x;
}
be.close();
ki<<fluxx()<<'\n';
ki.close();
return 0;
}