Pagini recente » Cod sursa (job #2795779) | Cod sursa (job #3253935) | Cod sursa (job #2962613) | Cod sursa (job #1161435) | Cod sursa (job #3207034)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
const int NMAX=405;
#define int long long
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector <int> v[NMAX];
queue <int> c;
int cost[NMAX][NMAX], cap[NMAX][NMAX];
int dist[NMAX], minm[NMAX], t[NMAX], viz[NMAX];
int n, m, s, d;
bool newc=true;
int flux();
int bellman(int);
signed main()
{
int i, a, b, c, dd;
fin>>n>>m>>s>>d;
for(i=1; i<=m; i++)
{
fin>>a>>b>>c>>dd;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b]=c;
cost[a][b]=dd;
cost[b][a]=-dd;
}
fout<<flux();
return 0;
}
int flux()
{
int ans=0;
while(newc)
{
newc=false;
ans+=bellman(s);
}
return ans;
}
int bellman(int nod)
{
int i, p;
for(i=1; i<=n; i++)
{
dist[i]=1e18;
viz[i]=0;
minm[i]=1e18;
t[i]=s;
}
c.push(nod);
dist[nod]=0;
while(!c.empty())
{
p=c.front(); c.pop();
if(viz[p]>n) continue;
viz[p]++;
for(auto i:v[p])
{
if(cap[p][i]>0 && dist[i]>dist[p]+cost[p][i])
{
dist[i]=dist[p]+cost[p][i];
minm[i]=min(minm[p], cap[p][i]);
t[i]=p;
if(viz[i]<n) c.push(i);
}
}
}
if(dist[d]==1e18) return 0;
nod=d; newc=true;
while(nod!=s)
{
cap[t[nod]][nod]-=minm[d];
cap[nod][t[nod]]+=minm[d];
nod=t[nod];
}
return minm[d]*dist[d];
}