Pagini recente » Cod sursa (job #1551097) | Cod sursa (job #1256874) | Cod sursa (job #1270084) | Cod sursa (job #1051679) | Cod sursa (job #2246721)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
#define MAX 360
#define INF 1000000000
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
typedef vector<int>::iterator iter;
int Cap[MAX][MAX], Cost[MAX][MAX], Flow[MAX][MAX];
vector<int> G[MAX];
queue<int> Q;
int dist[MAX], p[MAX], in[MAX];
int totalFlow = 0;
int n;
bool bfs(int s, int d){
int i;
for(i = 1 ; i <= n ; i++)
dist[i] = INF;
memset(p, 0, sizeof(p));
in[s] = 1;
dist[s] = 0;
Q.push(s);
while(Q.size()) {
int node = Q.front();
Q.pop();
in[node] = 0;
for(iter it = G[node].begin() ; it != G[node].end() ; it++) {
if(dist[node] + Cost[node][*it] < dist[*it] && Cap[node][*it] > Flow[node][*it]) {
dist[*it] = dist[node] + Cost[node][*it];
p[*it] = node;
if(in[*it] == 1)
continue;
in[*it] = 1;
Q.push(*it);
}
}
}
if(dist[d] == INF)
return 0;
int flux = INF;
for(int i = d ; i != s ; i = p[i]) {
flux = min(flux, Cap[p[i]][i] - Flow[p[i]][i]);
}
for(int i = d ; i != s ; i = p[i]) {
Flow[p[i]][i] += flux;
Flow[i][p[i]] -= flux;
}
totalFlow += flux * dist[d];
return 1;
}
int main(){
int m, i, j, s, d;
fin >> n >> m >> s >> d;
while(m--){
int x, y, c, z;
fin >> x >> y >> c >> z;
G[x].push_back(y);
G[y].push_back(x);
// cout << x << " " << y << "\n";
Cap[x][y] += c;
Cost[x][y] += z;
Cost[y][x] -= z;
Flow[x][y] = 0;
}
while(bfs(s, d)) {
}
fout << totalFlow << "\n";
}