Pagini recente » Cod sursa (job #1462275) | Istoria paginii utilizator/cartofen | Cod sursa (job #1040966) | Cod sursa (job #1897056) | Cod sursa (job #2016533)
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int f[360][360],n,m,s,d,i,x,y,ca,co,c[360][360],cst[360][360],tata[360],ans[360],flux,cost_flux;
bool ap[360];
vector<int>g[360];
bool bellman()
{
memset(ap,0,sizeof(ap));
memset(ans,inf,sizeof(ans));
memset(tata,-1,sizeof(tata));
queue<int>q;
ap[s]=true;
q.push(s);
ans[s]=0;
while(!q.empty())
{
int node=q.front();
ap[node]=false;
q.pop();
for(auto &it:g[node])
{
if(f[node][it]<c[node][it]&&ans[it]>ans[node]+cst[node][it])
{
if(!ap[it])ap[it]=true,q.push(it);
ans[it]=ans[node]+cst[node][it];
tata[it]=node;
}
}
}
if(ans[d]!=inf)return true;
return false;
}
void max_flow()
{
while(bellman())
{
int node=d;
int mi=inf;
while(node!=s)
{
mi=min(mi,c[tata[node]][node]-f[tata[node]][node]);
node=tata[node];
}
flux+=mi;
cost_flux+=mi*ans[d];
node=d;
while(node!=s)
{
f[tata[node]][node]+=mi;
f[node][tata[node]]-=mi;
node=tata[node];
}
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d%d",&x,&y,&ca,&co);
g[x].push_back(y);
g[y].push_back(x);
c[x][y]=ca;
cst[x][y]=co;
cst[y][x]=-co;
}
max_flow();
printf("%d\n",cost_flux);
return 0;
}