Pagini recente » Cod sursa (job #2450654) | Cod sursa (job #1536456) | Cod sursa (job #2607531) | Cod sursa (job #2478858) | Cod sursa (job #1658478)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 355
#define INF 0x3f3f3f3f
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
queue<int> coada;
vector<int> graf[MAXN];
int capacitate[MAXN][MAXN], cost[MAXN][MAXN], flux[MAXN][MAXN], dist[MAXN], tata[MAXN];
int n, m, st, fin, flux_crt, flux_maxim, cost_crt, cost_maxim;
bool bellman(int start, int fin)
{
int i, crt, urm;
for(i = 1; i<=n; i++)
{
tata[i] = 0;
dist[i] = INF;
}
dist[start] = 0;
coada.push(start);
while(!coada.empty())
{
crt = coada.front(); coada.pop();
for(i=0; i<graf[crt].size(); i++)
{
urm = graf[crt][i];
if(dist[urm] > dist[crt] + cost[crt][urm] && capacitate[crt][urm] > flux[crt][urm] )
{
dist[urm] = dist[crt] + cost[crt][urm];
tata[urm] = crt;
coada.push(urm);
}
}
}
if(dist[fin] == INF)
return 0;
return 1;
}
int main()
{
int i, j, x, y, z, w;
cin >> n >> m >> st >> fin;
for(i=1; i<=m; i++)
{
cin>>x>>y>>z>>w;
graf[x].push_back(y);
graf[y].push_back(x);
capacitate[x][y] = z;
cost[x][y] = w;
cost[y][x] = -w;
}
while( bellman(st, fin) )
{
flux_crt = INF;
for(i=fin; i!=st; i=tata[i])
flux_crt = min(flux_crt, capacitate[tata[i]][i] - flux[tata[i]][i]);
if(flux_crt)
{
cost_crt =0;
for(i=fin; i!=st; i=tata[i])
{
flux[tata[i]][i] += flux_crt;
flux[i][tata[i]] -= flux_crt;
cost_crt += cost[tata[i]][i];
}
flux_maxim += flux_crt;
cost_maxim += cost_crt*flux_crt;
}
}
cout<<<cost_maxim;
return 0;
}