Pagini recente » Cod sursa (job #929028) | Cod sursa (job #1298416) | Cod sursa (job #1158067) | Cod sursa (job #572598) | Cod sursa (job #411728)
Cod sursa(job #411728)
#include<stdio.h>
#define INF 5001
#define Nmx 355
#include<vector>
#include<queue>
using namespace std;
short C[Nmx][Nmx],Cst[Nmx][Nmx],prec[Nmx],F[Nmx][Nmx],viz[Nmx],cost[Nmx],n,m,s,d;
vector<short> G[Nmx];
struct cmp
{
bool operator () (const short &a,const short &b) const
{
return cost[a]>cost[b];
}
};
priority_queue <short,vector <short>,cmp> Q;
void citire()
{
scanf("%hd%hd%hd%hd",&n,&m,&s,&d);
short x,y,c,z;
for(int i=1;i<=m;++i)
{
scanf("%hd%hd%hd%hd",&x,&y,&c,&z);
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
Cst[x][y]=z;
Cst[y][x]=-z;
}
}
bool belmand()
{
for(short i=1;i<=n;++i)
cost[i]=INF;
cost[s]=0;
Q.push(s);
while(!Q.empty())
{
short nod=Q.top();
Q.pop();
viz[nod]=0;
for(int i=0;i<G[nod].size();++i)
{
short it=G[nod][i];
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.push(it);
}
}
}
}
if(cost[d]<INF)
return 1;
return 0;
}
void solve()
{
int sol=0;
while(belmand())
{
int Vmin=INF;
for(short i=d;i!=s;i=prec[i])
Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
for(short 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;
}