Pagini recente » Cod sursa (job #1111808) | Cod sursa (job #1007221) | Cod sursa (job #700724) | Cod sursa (job #386904) | Cod sursa (job #1934093)
#include <bits/stdc++.h>
#define NMAX 510
#define INF 2000000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,s,d;
vector<int> adj[NMAX];
int dist[NMAX],parent[NMAX];
queue<int> Q;
bitset<NMAX> inQueue;
int c[NMAX][NMAX],f[NMAX][NMAX],cost[NMAX][NMAX];
bool ok;
int bellmanFord() {
fill(dist+0,dist+n+1,INF);
fill(parent+0,parent+n+1,-1);
dist[s]=0;
Q.push(s);
inQueue.reset();
inQueue[s]=1;
while(Q.size()) {
int aux=Q.front();
inQueue[aux]=0;
Q.pop();
for(auto q:adj[aux]) {
if(c[aux][q]-f[aux][q]>0&&dist[aux]+cost[aux][q]<dist[q]) {
dist[q]=dist[aux]+cost[aux][q];
parent[q]=aux;
if(!inQueue[q]) {
Q.push(q);
inQueue[q]=1;
}
}
}
}
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,z,cap;
fin>>x>>y>>cap>>z;
adj[x].push_back(y);
adj[y].push_back(x);
c[x][y]=cap;
cost[x][y]=z;
cost[y][x]=-z;
}
int64_t result=0;
ok=1;
while(ok) {
ok=0;
result += bellmanFord();
}
fout<<result;
return 0;
}