Pagini recente » Cod sursa (job #1903963) | Cod sursa (job #1326264) | Cod sursa (job #1983912) | Cod sursa (job #562124) | Cod sursa (job #432754)
Cod sursa(job #432754)
#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;
#define NM 355
#define inf 2000000000
#define PB push_back
#define MKP make_pair
int N,M,S,D,C[NM][NM],F[NM][NM];
long long fmcm;
vector<pair<int,int> > G[NM];
queue<int> Q;
int BLF()
{
int DMIN[NM],FAT[NM];
char IN[NM];
for(int i=0;i<=N;++i)
{
DMIN[i]=inf;
IN[i]=0;
FAT[i]=0;
}
DMIN[S]=0;
IN[S]=1;
Q.push(S);
while(!Q.empty())
{
int nod=Q.front();
Q.pop();
IN[nod]=0;
if(IN[FAT[nod]]) continue;
for(int i=0;i<G[nod].size();++i)
{
int nnod=G[nod][i].first;
int cost=G[nod][i].second;
if(C[nod][nnod]-F[nod][nnod]<=0) continue;
if(DMIN[nnod]>DMIN[nod]+cost)
{
DMIN[nnod]=DMIN[nod]+cost;
FAT[nnod]=nod;
if(!IN[nnod])
{
Q.push(nnod);
IN[nnod]=1;
}
}
}
}
if(DMIN[D]==inf) return 0;
int nod=D,fc=inf;
while(FAT[nod])
{
int fat=FAT[nod];
fc=min(fc,C[fat][nod]-F[fat][nod]);
nod=fat;
}
fmcm+=(long long)fc*(long long)DMIN[D];
nod=D;
while(FAT[nod])
{
int fat=FAT[nod];
F[fat][nod]+=fc;
F[nod][fat]-=fc;
nod=fat;
}
return 1;
}
int main()
{
int a,b,c,d;
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,&c,&d);
G[a].PB(MKP(b,d));
G[b].PB(MKP(a,-d));
C[a][b]+=c;
}
while(BLF());
printf("%lld",fmcm);
return 0;
}