Pagini recente » Cod sursa (job #834917) | Cod sursa (job #3259135) | Cod sursa (job #1147520) | Cod sursa (job #942378) | Cod sursa (job #2962588)
#include<bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n, m, nod1, nod2, maxf,nod,i;
vector<vector<int>>l_ad;
vector<int>tata, viz, dist;
int cap[351][351], cost[351][351],a,b,c,d;
queue<int>que;
int bellman_ford(){
viz.assign(n+1, 0);
dist.assign(n+1, INT_MAX);
while(!que.empty())
que.pop();
que.push(nod1);
viz[nod1] = 1;
tata[nod1] = nod1;
dist[nod1] = 0;
while(!que.empty()){
int nod = que.front();
que.pop();
viz[nod] = 0;
for(auto vecin: l_ad[nod]){
if(cap[nod][vecin] > 0 && dist[vecin] > dist[nod] + cost[nod][vecin]){
dist[vecin] = dist[nod] + cost[nod][vecin];
tata[vecin] = nod;
if(!viz[vecin]){
que.push(vecin);
viz[vecin] = 1;}}}}
return dist[nod2];
}
int main() {
f>>n>>m>>nod1>>nod2;
l_ad.reserve(n+1);
tata.assign(n+1, 0);
for(i=0; i<m; i++){
f>>a>>b>>c>>d;
l_ad[a].push_back(b);
l_ad[b].push_back(a);
cap[a][b]= c;
cost[a][b]=d;
cost[b][a]=-d;
}
while(true){
int total = bellman_ford();
if(total == INT_MAX)
break;
int flow = INT_MAX;
for(nod = nod2; nod != nod1; nod = tata[nod]) {
flow = min(flow, cap[tata[nod]][nod]);
}
for(nod = nod2; nod != nod1; nod = tata[nod]) {
cap[tata[nod]][nod] -= flow;
cap[nod][tata[nod]] += flow;
}
maxf += flow * total;
}
g<<maxf;
return 0;
}