Pagini recente » Cod sursa (job #687117) | Cod sursa (job #475604) | Cod sursa (job #532710) | Cod sursa (job #1574478) | Cod sursa (job #1955441)
#include <bits/stdc++.h>
#define NMAX 360
#define INF 2000000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,s,d,ok;
vector<int> g[NMAX];
int f[NMAX][NMAX],c[NMAX][NMAX],cost[NMAX][NMAX];
int dist[NMAX],parent[NMAX];
bitset<NMAX> inQ;
queue<int> Q;
int bellman() {
fill(dist+1,dist+n+1,INF);
fill(parent+1,parent+n+1,INF);
Q.push(s);
inQ.reset();
dist[s]=0;
inQ[s]=1;
for(;Q.size();Q.pop()) {
int aux=Q.front();
inQ[aux]=0;
for(auto q:g[aux]) {
if(c[aux][q]-f[aux][q]>0&&dist[q]>dist[aux]+cost[aux][q]) {
parent[q]=aux;
dist[q]=dist[aux]+cost[aux][q];
if(!inQ[q]) {
inQ[q]=1;
Q.push(q);
}
}
}
}
if(dist[d]!=INF) {
int fMin=INF;
ok=1;
for(int i=d;i!=s;i=parent[i])
fMin=min(fMin,c[parent[i]][i]-f[parent[i]][i]);
for(int i=d;i!=s;i=parent[i]) {
f[parent[i]][i]+=fMin;
f[i][parent[i]]-=fMin;
}
return fMin*dist[d];
}
return 0;
}
int main()
{
fin>>n>>m>>s>>d;
for(int i=1;i<=m;i++) {
int x,y,w,z;
fin>>x>>y>>w>>z;
g[x].push_back(y);
g[y].push_back(x);
c[x][y]=w;
cost[x][y]=z;
cost[y][x]=-z;
}
ok=1;
int64_t result=0;
while(ok) {
ok=0;
result+=bellman();
}
fout<<result;
return 0;
}