Pagini recente » Cod sursa (job #2058316) | Cod sursa (job #1166642) | Cod sursa (job #2848405) | Cod sursa (job #2990482) | Cod sursa (job #2419245)
#include <fstream>
#include <vector>
#include <deque>
#define DIM 360
#define INF 2000000000
using namespace std;
ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
vector <int> L[DIM];
deque <int> q;
int viz[DIM],d[DIM],t[DIM],c[DIM][DIM],f[DIM][DIM],cst[DIM][DIM];
int n,m,i,j,s,dest,x,y,cost,capacitate,sol,dif;
inline int bellmanFord (){
for (int i=1;i<=n;i++){
d[i] = INF;
t[i] = viz[i] = 0;
}
//memset (viz,0,sizeof(viz));
q.push_back (s);
viz[s] = 1;
d[s] = 0;
while (!q.empty()){
int nod = q.front();
q.pop_front();
viz[nod] = 0;
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (c[nod][vecin] > f[nod][vecin] && d[nod]+cst[nod][vecin] < d[vecin]){
d[vecin] = d[nod]+cst[nod][vecin];
t[vecin] = nod;
if (!viz[vecin]){
q.push_back (vecin);
viz[vecin] = 1;
}}}}
if (d[dest] != INF)
return 1;
return 0;
}
int main (){
fin>>n>>m>>s>>dest;
for (i=1;i<=m;i++){
fin>>x>>y>>capacitate>>cost;
L[x].push_back(y);
L[y].push_back(x);
c[x][y] = capacitate;
cst[x][y] = cost, cst[y][x] = -cost;
}
while (bellmanFord()){
/// fac cele doua parcurgeri ale vectorului de tati
x = dest;
dif = INF;
while (x != s){
dif = min (dif,c[t[x]][x]-f[t[x]][x]);
x = t[x];
}
x = dest;
while (x != s){
f[t[x]][x] += dif;
f[x][t[x]] -= dif;
sol += cst[t[x]][x]*dif;
x = t[x];
}}
fout<<sol;
return 0;
}