Pagini recente » Cod sursa (job #1136941) | Cod sursa (job #2583607) | Cod sursa (job #2229008) | Cod sursa (job #2663451) | Cod sursa (job #1158962)
#include <cstdlib>
#include <cstring>
#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], dist[MAXN], viz[MAXN];
vector<int> G[MAXN];
queue< pair<int, int> > q;
bitset<MAXN> vizmuchie[MAXN];
bool dijkstra()
{
while (!q.empty()) q.pop();
for (int i = 1; i <= n; i++) viz[i] = 0;
memset(dist, 0x3f, sizeof(dist));
q.push(make_pair(s, s));
dist[s] = 0;
while (!q.empty()) {
int tnd = q.front().first;
int nd = q.front().second;
q.pop();
viz[nd]++;
if (viz[nd] > n) {
break;
}
if (dist[tnd] + cost[tnd][nd] == dist[nd]) {
t[nd] = tnd;
}
if (nd == d) {
//cout << "!!!\n\n";
system("pause");
continue;
}
for (iter it = G[nd].begin(); it != G[nd].end(); it++) {
if (vizmuchie[nd][*it] || cap[nd][*it] == fl[nd][*it] || dist[*it] < dist[nd] + cost[nd][*it]) {
continue;
}
dist[*it] = dist[nd] + cost[nd][*it];
q.push(make_pair(nd, *it));
}
/*for (int i = 1; i <= n; i++) {
cout << dist[i] << ' ';
}
cout << endl << endl;*/
system("pause");
}
//cout << endl;
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;
}
/*for (int i = 1; i <= n; i++) {
cout << i << ": ";
for (iter it = G[i].begin(); it != G[i].end(); it++) {
cout << *it << ' ';
}
cout << endl;
}
cout << endl;*/
int sol = 0;
while (dijkstra) {
/*for (int i = d; i != s; i = t[i]) {
cout << i << ' ';
}
cout << s << " -> ";*/
int fmin = INF;
for (int i = d; i != s; i = t[i]) {
fmin = min(fmin, cap[t[i]][i] - fl[t[i]][i]);
}
//cout << fmin << endl;
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;
}