Pagini recente » Clasament onis-2014-runda-1 | Cod sursa (job #2805653) | Cod sursa (job #2536325) | Cod sursa (job #2744777) | Cod sursa (job #1969796)
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a) for (int i = 0; i < a; i++)
#define FOR(i,a,b) for (int i = a; i <= b; i++)
#define ROF(i,a,b) for (int i = a; i >= b; i--)
#define FOREACH(it,x) for (auto it: (x))
#define pb push_back
#define SZ(x) ((int)(x).size())
const int inf = 1<<30;
int n,m,source,sink;
int g[351][351];
int c[351][351];
vector<int> G[351];
int dist[351];
int T[351];
bool in_queue[351];
bool bfs()
{
FOR(i,1,n) in_queue[i] = 0,T[i] = 0, dist[i] = inf;
T[source] = -1; dist[source] = 0;
queue<int> Q; Q.push(source); in_queue[source] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop(); in_queue[u] = 0;
if (u == sink) continue;
FOREACH(it,G[u]) if (dist[it] > dist[u] + c[u][it] && g[u][it] > 0) {
T[it] = u;
dist[it] = dist[u] + c[u][it];
if (!in_queue[it]) {
in_queue[it] = 1;
Q.push(it);
}
}
}
return dist[sink] != inf;
}
int FluxMaximCostMinim()
{
int mincost = 0,maxflow = 0;
while (bfs()) {
int minflow = inf;
for (int j = sink; j != source; j = T[j]) minflow = min(minflow,g[T[j]][j]);
for (int j = sink; j != source; j = T[j]) {
g[T[j]][j] -= minflow;
g[j][T[j]] += minflow;
}
mincost += minflow * dist[sink];
maxflow += minflow;
}
return mincost;
}
int main()
{
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
fin >> n >> m >> source >> sink;
while (m--) {
int x,y,cap,cost;
fin >> x >> y >> cap >> cost;
G[x].pb(y); G[y].pb(x);
g[x][y] = cap; c[x][y] = cost; c[y][x] = -cost;
}
fout << FluxMaximCostMinim();
}