Pagini recente » Cod sursa (job #1223571) | Cod sursa (job #1956866) | Cod sursa (job #2947341) | Cod sursa (job #1456321) | Cod sursa (job #977121)
Cod sursa(job #977121)
#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, Node, 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)), Node = Source, Distance[Source] = 0, Act[Source] = 0; !Q.empty() ; Q.pop(), Node = Q.top().second){
if( Distance[Node] != Q.top().first ) 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];
}
while(Dijkstra())
Handle_Flow();
cout << MinCostFlow << "\n";
cin.close();
cout.close();
return 0;
}