Pagini recente » Cod sursa (job #2853408) | Cod sursa (job #485496) | Cod sursa (job #1349177) | Cod sursa (job #803999) | Cod sursa (job #411710)
Cod sursa(job #411710)
#include<stdio.h>
#define INF 10000001
#define Nmx 350
#include<vector>
using namespace std;
int C[Nmx][Nmx],Cst[Nmx][Nmx],prec[Nmx],F[Nmx][Nmx],viz[Nmx],cost[Nmx],n,m,s,d;
vector<int> G[Nmx];
int Q[Nmx*Nmx];
void citire()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
int x,y,c,z;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
G[x].push_back(y);
C[x][y]=c;
Cst[x][y]=z;
}
}
int belmand()
{
vector<int> ::iterator it;
int st,dr;
for(int i=1;i<=n;++i)
cost[i]=INF;
cost[s]=0;
st=dr=1;
Q[st]=s;
while(st<=dr)
{
int nod=Q[st];
viz[nod]=0;
for(it=G[nod].begin();it!=G[nod].end();++it)
if(cost[*it]>cost[nod]+Cst[nod][*it]&&C[nod][*it]-F[nod][*it]>0)
{
cost[*it]=cost[nod]+Cst[nod][*it];
prec[*it]=nod;
if(!viz[*it])
{
viz[*it]=1;
Q[++dr]=*it;
}
}
++st;
}
if(cost[d]<INF)
return 1;
return 0;
}
void solve()
{
int sol=0;
while(belmand())
{
int Vmin=INF;
for(int i=d;i!=s;i=prec[i])
Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
for(int i=d;i!=s;i=prec[i])
{
F[prec[i]][i]+=Vmin;
F[i][prec[i]]-=Vmin;
}
sol+=Vmin*cost[d];
}
printf("%d\n",sol);
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
citire();
solve();
return 0;
}