Pagini recente » Cod sursa (job #1130899) | Cod sursa (job #1303752) | Cod sursa (job #1931032) | Cod sursa (job #2281388) | Cod sursa (job #395207)
Cod sursa(job #395207)
#include<stdio.h>
#include<vector>
using namespace std;
#define Nmax 360
#define inf 0x3f3f3f3f
vector <int> l[Nmax];
int n,m,S,D;
int F[Nmax][Nmax],C[Nmax][Nmax];
int c[Nmax],st,dr,p[Nmax],d[Nmax],poz[Nmax];
int Sol;
int BF()
{
int nod;
for(int i=1;i<=n;++i)
{
d[i]=inf;
poz[i]=0;
}
d[S]=0;
c[1]=S;
poz[S]=1;
for(st=1 , dr=1 ; st<=dr ; ++st)
for(int i=0 ; i<(int)l[ c[st] ].size() ; ++i)
{
nod = l[ c[st] ][i];
if (F[ c[st] ][nod]>0 && d[ nod ] > d[ c[st] ] + C[ c[st] ][nod])
{
d[ nod ] = d[ c[st] ] + C[ c[st] ][nod];
if ( poz[nod] <= st)
{
c[++dr]= nod;
p[dr]= st;
poz[ nod ]=dr;
}
else
p[ poz[nod] ]=st;
}
}
/* printf("c: ");
for(int i=1;i<=dr;++i)
printf("%d ",c[i]);
printf("\n");
printf("p: ");
for(int i=1;i<=dr;++i)
printf("%d ",p[i]);
printf("\n");
printf("d: ");
for(int i=1;i<=n;++i)
printf("%d ",d[i]);
printf("\n");
printf("\n");*/
if (d[D]==inf)
return 0;
return 1;
}
void solve()
{
int M;
for(int x=1 ; x ; )
{
x=BF();
if (!x)
return ;
M=inf;
for(int i= poz[D] ; c[i]!=S ; i=p[i])
if (M > F[ c[p[i]] ][ c[i] ])
M = F[ c[p[i]] ][ c[i] ];
for(int i= poz[D] ; c[i]!=S ; i=p[i])
{
F[ c[p[i]] ][ c[i] ] -= M;
F[ c[i] ][ c[p[i]] ] += M;
}
Sol += M*d[D];
}
}
void cit();
int main()
{
cit();
solve();
printf("%d\n",Sol);
return 0;
}
void cit()
{
int a,b,c,f;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&S,&D);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d%d",&a,&b,&f,&c);
l[a].push_back(b);
l[b].push_back(a);
F[a][b]=f;
C[a][b]=c;
C[b][a]=-c;
}
}