Pagini recente » Cod sursa (job #2312249) | Cod sursa (job #345004) | Cod sursa (job #2438982) | Cod sursa (job #2372494) | Cod sursa (job #566493)
Cod sursa(job #566493)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#define Nmax 351
#define inf 0x3f3f3f3f
using namespace std;
int N,M,S,D,fm[Nmax][Nmax],cp[Nmax][Nmax],cost[Nmax][Nmax],v[Nmax],t[Nmax],inQ[Nmax],sol;
vector <int> a[Nmax];
queue <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<int>::iterator it= a[nod].begin();it!=a[nod].end();++it){
if( v[*it] > v[nod] + cost [nod] [*it] && cp[nod][*it] > fm[nod][*it]){
v[*it] = v[nod] + cost [nod] [*it];
t[*it] = nod;
if(!inQ[*it] && *it!=D){
inQ[*it]=1;
q.push(*it);}
}
}
}
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(y);
a[y].push_back(x);
cp[x][y]=c;
cost[x][y]=z;
cost[y][x]=-z;
}
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;
}