Pagini recente » Cod sursa (job #3291516) | Cod sursa (job #2508286) | Cod sursa (job #2343523) | Cod sursa (job #2847905) | Cod sursa (job #568590)
Cod sursa(job #568590)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#define cost (*it).second
#define dest (*it).first
#define Nmax 351
#define inf 0x3f3f3f3f
using namespace std;
int N,M,S,D,sol;
int v[Nmax];
short int t[Nmax],cp[Nmax][Nmax],fm[Nmax][Nmax];
bool inQ[Nmax];
vector <pair<short int,short int> > a[Nmax];
queue <short int> q;
int bf(){
memset(inQ,0,sizeof(inQ));
memset(v,inf,sizeof(v));
v[S]=0;
q.push(S);
while(!q.empty()) {
int nod = q.front();
q.pop();
inQ[nod]=0;
for(vector<pair<short int,short int> >::iterator it= a[nod].begin();it!=a[nod].end();++it){
if( v[dest] > v[nod] + cost && cp[nod][dest] > fm[nod][dest]){
v[dest] = v[nod] + cost;
t[dest] = nod;
if(!inQ[dest] && dest!=D){
inQ[dest]=1;
q.push(dest);}
}
}
}
if(v[D]!=inf)
return 1;
return 0;
}
int main(){
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){
int x,y,c,z;
scanf("%d%d%d%d",&x,&y,&c,&z);
a[x].push_back(make_pair(y,z));
a[y].push_back(make_pair(x,-z));
cp[x][y]=c;
}
while(bf()){
int fmn=inf;
for(int nod=D;nod!=S;nod=t[nod])
fmn=min(fmn,cp[t[nod]][nod]-fm[t[nod]][nod]);
for(int nod=D;nod!=S;nod=t[nod]){
fm[t[nod]][nod]+=fmn;
fm[nod][t[nod]]-=fmn;
}
sol+=fmn*v[D];
}
printf("%d\n",sol);
return 0;
}