Pagini recente » Cod sursa (job #2038712) | Cod sursa (job #1157032) | Cod sursa (job #1821363) | Cod sursa (job #1854347) | Cod sursa (job #764705)
Cod sursa(job #764705)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;
//ifstream in ("fmcm.in");
//ofstream out ("fmcm.out");
const short MAXN = 360;
const short INF = 1 << 14;
vector < pair < short, short > > graf[MAXN];
short c[MAXN][MAXN], f[MAXN][MAXN], dist[MAXN], t[MAXN];
bool viz[MAXN];
short N, M, S, D;
char *buffer;
struct comp
{
bool operator () (const short &a, const short &b){
return dist[a] > dist[b];
}
};
priority_queue < short, vector <short>, comp > Q;
inline void getmin (short &a, short b)
{
if (a > b)
a = b;
}
inline bool BF ()
{
vector < pair < short, short > > :: iterator it;
short 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);
}
void read (short &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 ()
{
short x, y, cap, cost, fs, fm, flux = 0, i;
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));
}
for ( ; BF (); flux += fm * dist[D]){
fm = INF;
for (i = D; i != S; i = t[i])
getmin (fm, c[ t[i] ][i] - f[ t[i] ][i]);
if (!fm)
continue;
for (i = D; i != S; i = t[i]){
f[ t[i] ][i] += fm;
f[i][ t[i] ] -= fm;
}
}
//out << flux ();
//prshortf ("%d", flux ());
printf ("%d", flux);
return 0;
}