Pagini recente » Cod sursa (job #3292120) | Cod sursa (job #1328243) | Cod sursa (job #1803081) | Cod sursa (job #558459) | Cod sursa (job #568583)
Cod sursa(job #568583)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#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],cost[Nmax][Nmax];
bool inQ[Nmax];
vector <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<short 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;
}