Pagini recente » Cod sursa (job #1506573) | Cod sursa (job #686126) | Cod sursa (job #618431) | Cod sursa (job #2143222) | Cod sursa (job #1158726)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
using namespace std;
typedef vector<int>::iterator iter;
#define INF 0x3f3f3f3f
#define MAXN 355
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n, s, d;
int cap[MAXN][MAXN], fl[MAXN][MAXN], cost[MAXN][MAXN], t[MAXN];
vector<int> G[MAXN];
priority_queue< pair< int, pair<int, int> > > pq;
bitset<MAXN> viz;
bool dijkstra()
{
viz.reset();
pq.push(make_pair(0, make_pair(s, s)));
while (!pq.empty()) {
int dist = -pq.top().first;
int tnd = pq.top().second.first;
int nd = pq.top().second.second;
pq.pop();
if (viz[nd] == true) {
continue;
}
viz[nd] = true;
t[nd] = tnd;
for (iter it = G[nd].begin(); it != G[nd].end(); it++) {
if (viz[*it] == true || cap[nd][*it] == fl[nd][*it]) {
continue;
}
pq.push(make_pair(-dist - cost[nd][*it], make_pair(nd, *it)));
}
}
return viz[d];
}
int main()
{
int m;
f >> n >> m >> s >> d;
for (int i = 1; i <= m; i++) {
int x, y, c, z;
f >> x >> y >> c >> z;
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = c;
cost[x][y] = z;
cost[y][x] = -z;
}
int sol = 0;
while (dijkstra()) {
for (iter it = G[d].begin(); it != G[d].end(); it++) {
if (viz[*it] == false) {
continue;
}
t[d] = *it;
int fmin = INF;
for (int i = d; i != s; i = t[i]) {
fmin = min(fmin, cap[t[i]][i] - fl[t[i]][i]);
}
for (int i = d; i != s; i = t[i]) {
fl[t[i]][i] += fmin;
fl[i][t[i]] -= fmin;
sol += fmin * cost[t[i]][i];
}
}
}
g << sol << '\n';
f.close();
g.close();
return 0;
}