Pagini recente » Cod sursa (job #1303117) | Cod sursa (job #378670) | Cod sursa (job #402334) | Cod sursa (job #994418) | Cod sursa (job #1526656)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
#define MAX 355
#define INF 2000000000
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
int i, n, dist[MAX], dad[MAX], in[MAX];
int s, d, st, dr, q[MAX * MAX], F[MAX][MAX], C[MAX][MAX], Ca[MAX][MAX], flow;
int maxflow, m, x, y;
bool bfs()
{
int nod;
int i;
for(i = 1 ; i <= n ; i++)
dist[i] = INF;
dist[s] = 0;
st = 0;
dr = 0;
q[dr] = s;
in[s] = 1;
while(st <= dr)
{
nod = q[st++];
in[nod] = 0;
//cout << nod << " " << dist[nod] << "\n";
for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
{
if(F[nod][*it] < Ca[nod][*it] && dist[*it] > dist[nod] + C[nod][*it])
{
dist[*it] = dist[nod] + C[nod][*it];
dad[*it] = nod;
if(in[*it] == 0)
{
in[*it] = 1;
q[++dr] = *it;
}
}
}
}
flow = INF;
for(int i = d ; dad[i] ; i = dad[i])
{
flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
}
for(int i = d ; dad[i] ; i = dad[i])
{
// maxflow += flow * C[dad[i]][i];
F[dad[i]][i] += flow;
F[i][dad[i]] -= flow;
}
if(dist[d] != INF)
maxflow += flow * dist[d];
return dist[d] != INF;
}
int main()
{
fin >> n >> m >> s >> d;
while(m--)
{
fin >> x >> y;
fin >> Ca[x][y] >> C[x][y];
C[y][x] = -C[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
while(bfs())
{
}
fout << maxflow << "\n";
}