Pagini recente » Cod sursa (job #2585358) | Cod sursa (job #1414513) | Cod sursa (job #832143) | Cod sursa (job #1598694) | Cod sursa (job #1968392)
#include <bits/stdc++.h>
#define Nmax 355
#define pb push_back
#define INF 1000000000
using namespace std;
int C[Nmax][Nmax],Cost[Nmax][Nmax],F[Nmax][Nmax],dist[Nmax],prv[Nmax],S,D,n;
bool seen[Nmax];
vector <int> L[Nmax];
queue <int> Q;
inline void add_edge(int x, int y, int cap, int cost)
{
L[x].pb(y); L[y].pb(x);
C[x][y]=cap; Cost[x][y]=cost;
Cost[y][x]=-cost;
}
inline bool Bellman()
{
int i,nod;
for(i=1;i<=n;++i) dist[i]=INF;
dist[S]=0; Q.push(S);
while(!Q.empty())
{
nod=Q.front(); Q.pop();
seen[nod]=0;
for(auto it : L[nod])
if(F[nod][it]<C[nod][it] && dist[it] > dist[nod]+Cost[nod][it])
{
dist[it] = dist[nod]+Cost[nod][it];
prv[it]=nod;
if(!seen[it])
{
Q.push(it);
seen[it]=1;
}
}
}
return (dist[D]!=INF);
}
inline int Flow()
{
int min_flow,cost=0,i;
while(Bellman())
{
min_flow=INF;
for(i=D;i!=S;i=prv[i])
min_flow=min(min_flow,C[prv[i]][i]-F[prv[i]][i]);
for(i=D;i!=S;i=prv[i])
{
cost+=min_flow*Cost[prv[i]][i];
F[prv[i]][i]+=min_flow;
F[i][prv[i]]-=min_flow;
}
}
return cost;
}
int main()
{
int x,y,cap,cost,m;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
cin>>n>>m>>S>>D;
while(m--)
{
cin>>x>>y>>cap>>cost;
add_edge(x,y,cap,cost);
}
cout<<Flow()<<"\n";
return 0;
}