Pagini recente » Cod sursa (job #1884808) | Cod sursa (job #1321071) | Cod sursa (job #2892484) | Cod sursa (job #3122779) | Cod sursa (job #870183)
Cod sursa(job #870183)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 351;
const int inf = 0x3f3f3f3f;
int cap[N][N], flux[N][N], cost[N][N], dist[N], T[N], n, S, D;
bool use[N];
vector<int> graph[N];
queue<int> Q;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
inline int augment(int x, int y){
return cap[x][y] - flux[x][y];
}
bool bf(int S, int D){
memset(dist, inf, sizeof(dist));
dist[S] = 0;
Q.push(S);
while (!Q.empty()){
int x = Q.front(); Q.pop();
if (x == D)
continue;
use[x] = false;
for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++)
if (augment(x, *it) && dist[x] + cost[x][*it] < dist[*it]){
T[*it] = x;
dist[*it] = dist[x] + cost[x][*it];
if (!use[*it]){
use[*it] = true;
Q.push(*it);
}
}
}
return dist[D] != inf;
}
int maxFlow(int S, int D){
while(bf(S, D)){
int add = inf;
for (int i = D ; i != S ; i = T[i])
add = min(add, augment(T[i], i));
for (int i = D ; i != S ; i = T[i]){
flux[ T[i] ][i] += add;
flux[i][ T[i] ] -= add;
}
}
int C = 0;
for (int i = 1 ; i <= n ; i++)
for (int j = 1 ; j <= n ; j++)
C += flux[i][j] * cost[i][j];
return C / 2;
}
void get_graph(){
int m, x, y;
in >> n >> m >> S >> D;
while (m--){
in >> x >> y;
in >> cap[x][y] >> cost[x][y];
cost[y][x] = -cost[x][y];
graph[x].push_back(y);
graph[y].push_back(x);
}
}
int main(){
get_graph();
out << maxFlow(S, D) << "\n";
return 0;
}