Pagini recente » Cod sursa (job #263655) | Cod sursa (job #1770832) | Cod sursa (job #326850) | Cod sursa (job #2384067) | Cod sursa (job #977126)
Cod sursa(job #977126)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <string.h>
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
const int MAXN = 355;
const int oo = 0x3f3f3f3f;
typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;
Graph G;
int N, M, Source, Sink, Qu[MAXN][MAXN], Cost[MAXN][MAXN], MinCostFlow;
vector<int>Old(MAXN), Distance(MAXN) , Act(MAXN), Father(MAXN);
priority_queue <pair<int, int> , vector<pair <int, int> >, greater <pair<int, int> > > Q;
bool Dijkstra() {
fill(Distance.begin(), Distance.end() , oo);
for(Q.push(make_pair(0, Source)), Distance[Source] = 0, Act[Source] = 0; !Q.empty() ; ){
int Node = Q.top().second, Value = Q.top().first;
Q.pop();
if( Distance[Node] != Value ) continue;
for(It it = G[Node].begin() , fin = G[Node].end() ; it != fin ; ++ it)
if(Qu[Node][*it]) {
int act = Cost[Node][*it] + Old[Node] - Old[*it];
if(Distance[*it] > Distance[Node] + act){
Distance[*it] = Distance[Node] + act;
Father[*it] = Node;
Act[*it] = Act[Node] + Cost[Node][*it];
Q.push(make_pair(Distance[*it], *it));
}
}
}
Old = Act;
return (Distance[Sink] != oo);
}
void Handle_Flow() {
int MinFlow = oo;
for(int i = Sink ; i != Source ; i = Father[i])
MinFlow = min ( MinFlow, Qu[Father[i]][i]);
for(int i = Sink; i != Source; i = Father[i])
Qu[Father[i]][i] -= MinFlow,
Qu[i][Father[i]] += MinFlow;
MinCostFlow += (MinFlow * Act[Sink]);
}
int main() {
for( cin >> N >> M >> Source >> Sink ; M ; -- M){
int X, Y;
cin >> X >> Y;
G[X].push_back(Y);
G[Y].push_back(X);
cin >> Qu[X][Y] >> Cost[X][Y];
Cost[Y][X] = Cost[X][Y]*(-1);
}
while(Dijkstra())
Handle_Flow();
cout << MinCostFlow << "\n";
cin.close();
cout.close();
return 0;
}