Pagini recente » Cod sursa (job #226) | Cod sursa (job #2554876) | Flux si cuplaj | Cod sursa (job #2810867) | Cod sursa (job #2592225)
#include <bits/stdc++.h>
using namespace std;
#define st first
#define nd second
#define pb push_back
#define mkp make_pair
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define PII pair<int,int>
#define VI vector<int>
#define VPII vector<PII>
#define all(x) x.begin(),b.end()
#define SZ(x) ((int)(x).size())
#define ll long long
#define maxn 355
ifstream fin("fmcm.in"); ofstream fout("fmcm.out");
const int INF=0x3f3f3f3f;
int N,M,S,D,cst[maxn][maxn],C[maxn][maxn],nod,mini;
int TT[maxn],Cmin,d[maxn],cost,reald[maxn],old[maxn],inq[maxn];
VI g[maxn];
priority_queue<PII,VPII,greater<PII> >heap;
bool fmcm()
{ FOR(i,1,N) d[i]=INF;
d[S]=0;reald[S]=0;
heap.push(mkp(d[S],S));
while(!heap.empty())
{ cost=heap.top().st;
nod=heap.top().nd;
heap.pop();
if(cost>d[nod]) continue;
for(auto it:g[nod])
if(C[nod][it])
{ int newc=d[nod]+cst[nod][it]+old[nod]-old[it];
if(newc<d[it])
{ d[it]=newc;
reald[it]=reald[nod]+cst[nod][it];
TT[it]=nod;
heap.push(mkp(newc,it));
}
}
}
memcpy(old,reald,sizeof(d));
if(d[D]==INF) return 0;
mini=INF;
for(int u=D;u!=S;u=TT[u])
mini=min(mini,C[TT[u]][u]);
for(int u=D;u!=S;u=TT[u])
{ C[TT[u]][u]-=mini;
C[u][TT[u]]+=mini;
}
Cmin+=(mini*reald[D]);
return 1;
}
void bellman()
{ memset(old,INF,sizeof(old));
queue<int> que;
que.push(S);
old[S]=0;
while(!que.empty())
{ int nod=que.front();
que.pop();
inq[nod]=0;
for(auto it:g[nod])
if(C[nod][it])
{ int newv=old[nod]+cst[nod][it];
if(old[it]>newv)
{ old[it]=newv;
if(!inq[it])
{ inq[it]=1;
que.push(it);
}
}
}
}
}
int main()
{ int x,y,c,z;
fin>>N>>M>>S>>D;
FOR(i,1,M)
{ cin>>x>>y>>c>>z;
g[x].pb(y);
g[y].pb(x);
C[x][y]=c;
cst[x][y]=z,cst[y][x]=-z;
}
bellman();
for(;fmcm(););
fout<<Cmin;
fout.close(); return 0;
}