Pagini recente » Cod sursa (job #700899) | Cod sursa (job #1725454) | Cod sursa (job #3266071) | Cod sursa (job #2311653) | Cod sursa (job #639205)
Cod sursa(job #639205)
#include <iostream>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define LL long long
#define PB push_back
#define NM 510
#define inf 1000000000
LL flow;
int C[NM][NM], F[NM][NM], D[NM][NM], s, d, N, M;
vector <int> G[NM];
int blf()
{
int inside[NM], fat[NM], dist[NM];
queue <int> Q;
memset (inside, 0, sizeof(inside));
for (int i = 1; i <= N; ++i) dist[i] = inf;
Q.push(s);
inside[s] = 1;
dist[s] = 0;
fat[s] = 0;
while (!Q.empty())
{
int node = Q.front();
Q.pop();
inside[node] = 0;
for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
{
int nnode = *it;
if (C[node][nnode] == F[node][nnode]) continue;
if (dist[node] + D[node][nnode] < dist[nnode])
{
dist[nnode] = dist[node] + D[node][nnode];
fat[nnode] = node;
if (!inside[nnode])
{
Q.push(nnode);
inside[nnode] = 1;
}
}
}
}
/*
for (int i = 1; i <= N; ++i) printf ("%d ", dist[i]);
printf ("\n");
*/
if (dist[d] == inf) return 0;
int node = d;
int flowadd = inf;
while (fat[node])
{
int nnode = fat[node];
flowadd = min(flowadd, C[nnode][node] - F[nnode][node]);
node = nnode;
}
node = d;
while (fat[node])
{
int nnode = fat[node];
F[nnode][node] += flowadd;
F[node][nnode] -= flowadd;
node = nnode;
}
flow += (LL)dist[d]*flowadd;
return 1;
}
int main()
{
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);
scanf ("%d %d %d %d", &N, &M, &s, &d);
for (int i = 1; i <= M; ++i)
{
int a, b, c, cs;
scanf ("%d %d %d %d", &a, &b, &c, &cs);
G[a].PB(b);
G[b].PB(a);
C[a][b] = c;
D[a][b] = cs;
D[b][a] = -cs;
}
/*
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j) printf ("%d ", C[i][j]);
printf ("\n");
}
*/
while (blf());
printf ("%I64d", flow);
return 0;
}