Pagini recente » Cod sursa (job #2544586) | Cod sursa (job #523010) | Cod sursa (job #1173810) | Cod sursa (job #458297) | Cod sursa (job #2475357)
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int cost[360][360];
int cap[360][360];
int apa[360][360];
int n, m, s, d;
vector<int> g[360];
int inQueue[360];
int dist[360];
int tata[360];
int costTotal = 0;
bool bellman()
{
queue<int> q;
memset(inQueue, 0, sizeof(inQueue));
memset(dist, 0x3f, sizeof(dist));
tata[s] = -1;
dist[s] = 0;
inQueue[s] = 1;
q.push(s);
while(!q.empty())
{
int nod = q.front();
q.pop();
for(int vnod : g[nod])
{
if(apa[nod][vnod] < cap[nod][vnod] && dist[vnod] > dist[nod] + cost[nod][vnod])
{
dist[vnod] = dist[nod] + cost[nod][vnod];
tata[vnod] = nod;
if(!inQueue[vnod])
{
inQueue[vnod] = 1;
q.push(vnod);
}
}
}
}
if(dist[d] == inf)
return false;
int capmin = inf;
for(int t = d; tata[t] != -1; t = tata[t])
{
capmin = min(capmin, cap[tata[t]][t] - apa[tata[t]][t]);
}
for(int t = d; tata[t] != -1; t = tata[t])
{
costTotal += capmin * cost[tata[t]][t];
apa[tata[t]][t] += capmin;
}
return true;
}
int main() {
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
cin >> n >> m >> s >> d;
for(int i = 0; i < m; i++)
{
int a, b, c, z;
cin >> a >> b >> c >> z;
cost[a][b] = z;
cost[b][a] = -z;
cap[a][b] = c;
cap[b][a] = 0;
g[a].push_back(b);
g[b].push_back(a);
}
while(bellman());
cout << costTotal;
return 0;
}