Pagini recente » Cod sursa (job #1324818) | Cod sursa (job #322503) | Cod sursa (job #3202836) | Cod sursa (job #243505) | Cod sursa (job #764696)
Cod sursa(job #764696)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
//ifstream in ("fmcm.in");
//ofstream out ("fmcm.out");
const int MAXN = 360;
const int INF = 1 << 30;
vector < pair < int, int > > graf[MAXN];
int c[MAXN][MAXN], f[MAXN][MAXN], dist[MAXN], t[MAXN];
bool viz[MAXN];
int N, M, S, D;
char *buffer;
struct comp
{
bool operator () (const int &a, const int &b){
return dist[a] > dist[b];
}
};
priority_queue < int, vector <int>, comp > Q;
inline void getmin (int &a, int b)
{
if (a > b)
a = b;
}
inline bool BF ()
{
vector < pair < int, int > > :: iterator it;
int nod, i;
for (i = 1; i <= N; ++i){
dist[i] = INF;
viz[i] = 0;
t[i] = 0;
}
dist[S] = 0;
Q.push (S);
while (!Q.empty ()){
nod = Q.top ();
Q.pop ();
viz[nod] = 0;
for (it = graf[nod].begin (); it != graf[nod].end (); ++it)
if (dist[nod] + (it -> second) < dist[it -> first] && c[nod][it -> first] != f[nod][it -> first]){
dist[it -> first] = dist[nod] + (it -> second);
t[it -> first] = nod;
if (!viz[it -> first]){
viz[it -> first] = 1;
Q.push (it -> first);
}
}
}
return (dist[D] != INF);
}
int flux ()
{
int fm, sol = 0, i;
for ( ; BF (); sol += fm * dist[D]){
fm = INF;
for (i = D; i != S; i = t[i])
getmin (fm, c[ t[i] ][i] - f[ t[i] ][i]);
for (i = D; i != S; i = t[i]){
f[ t[i] ][i] += fm;
f[i][ t[i] ] -= fm;
}
}
return sol;
}
void read (int &x)
{
short neg = 1;
while (*buffer < '0' || *buffer > '9'){
++buffer;
if (*buffer == '-')
neg = (-1);
}
x = 0;
while (*buffer >= '0' && *buffer <= '9'){
x = (x * 10) + (*buffer - '0');
++buffer;
}
x *= neg;
}
int main ()
{
int x, y, cap, cost, fs;
freopen ("fmcm.in", "r", stdin);
freopen ("fmcm.out", "w", stdout);
fseek (stdin, 0, SEEK_END);
fs = ftell (stdin);
buffer = (char*) malloc (fs);
rewind (stdin);
fread (buffer, 1, fs, stdin);
//in >> N >> M >> S >> D;
read(N), read(M), read(S), read(D);
while (M--){
//in >> x >> y >> cap >> cost;
read(x), read(y), read(cap), read(cost);
c[x][y] = cap;
graf[x].push_back (make_pair (y, +cost));
graf[y].push_back (make_pair (x, -cost));
}
//out << flux ();
printf ("%d", flux ());
return 0;
}