Pagini recente » Cod sursa (job #2041547) | Cod sursa (job #119142) | Cod sursa (job #939171) | Cod sursa (job #911163) | Cod sursa (job #918225)
Cod sursa(job #918225)
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <string.h>
#include <iomanip>
using namespace std;
const string file = "fmcm";
const string infile = file + ".in";
const string outfile = file + ".out";
#define MAXN 355
#define INF 1<<29
vector<pair<int, int> > Graf[MAXN];
int Rezidual[MAXN][MAXN];
int Flux[MAXN][MAXN];
int Parrent[MAXN];
int CostMin;
int FluxMax;
int N;
int M;
int S;
int D;
int prec[MAXN];
int dist[MAXN];
int inQ[MAXN];
void citire()
{
ifstream fin(infile.c_str());
fin >> N >> M;
fin >> S >> D;
for(int i = 0; i < M; i++)
{
int x, y , cap, cst;
fin >> x >> y >> cap >> cst;
Graf[x].push_back(make_pair(y, cst));
Graf[y].push_back(make_pair(x, -cst));
Rezidual[x][y] += cap;
}
fin.close();
}
bool BellmanFord()
{
for(int i = 0; i <= N; i++)
{
dist[i] = INF;
prec[i] = 0;
}
queue<int> q;
q.push(S);
dist[S] = 0;
inQ[S] = true;
while(q.empty() == false)
{
int current = q.front();
q.pop();
inQ[current] = false;
for (vector<pair<int, int> >::iterator itr = Graf[current].begin();
itr != Graf[current].end();
itr++)
{
int vecin = itr->first;
int cost = itr->second;
if(Rezidual[current][vecin] != Flux[current][vecin] && dist[vecin] > dist[current] + cost)
{
prec[vecin] = current;
dist[vecin] = dist[current] + cost;
if(inQ[vecin] == false)
{
inQ[vecin] = true;
q.push(vecin);
}
}
}
}
if(prec[D] == 0)
{
return false;
}
return true;
}
void solve()
{
while(BellmanFord())
{
int fmin = INF;
for(int nod = D; nod != S; nod = prec[nod])
{
fmin = min(fmin, Rezidual[prec[nod]][nod] - Flux[prec[nod]][nod]);
}
for(int nod = D; nod != S; nod = prec[nod])
{
Flux[prec[nod]][nod] += fmin;
Flux[nod][prec[nod]] -= fmin;
}
CostMin += fmin * dist[D];
if(fmin == 0)
break;
}
}
void afisare()
{
ofstream fout(outfile.c_str());
fout << CostMin << "\n";
fout << "\n";
fout.close();
}
int main()
{
citire();
solve();
afisare();
}