Mai intai trebuie sa te autentifici.
Cod sursa(job #975888)
Utilizator | Data | 21 iulie 2013 22:45:46 | |
---|---|---|---|
Problema | Flux maxim de cost minim | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.45 kb |
#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 = (1<<31)-1;
typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;
Graph G;
int N, M, S, D, Capacity[MAXN][MAXN], Cost[MAXN][MAXN], Answer;
vector<int> Distance(MAXN, oo), Flow(MAXN), Father(MAXN);
priority_queue <pair<int, int> > Heap;
queue <int> Q;
inline bool BellmanFord(){
for(Q.push(S), Distance[S] = 0 ; !Q.empty() ; Q.pop() ){
int Node = Q.front();
for(It it=G[Node].begin(), fin=G[Node].end(); it!=fin; ++it)
if(Capacity[Node][*it] && Distance[*it] > Distance[Node] + Capacity[Node][*it]){
Distance[*it] = Distance[Node] + Capacity[Node][*it];
Q.push(*it);
}
}
}
inline bool Update_Flow(){
fill(Distance.begin(), Distance.end(), oo);
for(Distance[S] = 0, Heap.push(make_pair(0, S)), Flow[S] = 0 ; !Heap.empty() ; Heap.pop()){
int Node = Heap.top().second;
int d = -Heap.top().first;
if(Distance[Node] < d) continue;
for(It it = G[Node].begin(), fin = G[Node].end() ; it != fin ; ++it)
if( Capacity[Node][*it] ){
d = Distance[Node] + Cost[Node][*it] - Distance[*it];
if(Distance[*it] <= Distance[Node] + d) continue;
Distance[*it] = Distance[Node] + d;
Flow[*it] = Flow[Node] + Cost[Node][*it];
Father[*it] = Node;
Heap.push(make_pair(-Distance[*it], *it));
}
}
Flow = Distance;
return Distance[D] != oo;
}
int main()
{
cin >> N >> M >> S >> D;
for(int i = 1 ; i <= M ; ++ i){
int x, y, z, c;
cin >> x >> y >> c >> z;
G[x].push_back(y);
G[y].push_back(x);
Capacity[x][y] = c;
Cost[x][y] = z;
Cost[y][x] = -z;
}
//BellmanFord();
for(int flow ; Update_Flow() ; Answer += flow*Flow[D] ){
flow = oo;
for(int i = D ; i != S ; i = Father[i])
flow = min (flow, Capacity[Father[i]][i]);
for(int i = D ; i != S ; i = Father[i])
Capacity[Father[i]][i] -= flow,
Capacity[i][Father[i]] += flow;
}
cout << Answer << "\n";
cin.close();
cout.close();
return 0;
}