Pagini recente » Cod sursa (job #2895092) | Cod sursa (job #1786633) | Cod sursa (job #1031058) | Cod sursa (job #2508546) | Cod sursa (job #403092)
Cod sursa(job #403092)
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#define Nmx 355
#define INF 5001
using namespace std;
short C[Nmx][Nmx],F[Nmx][Nmx],Cst[Nmx][Nmx];
short viz[Nmx],cost[Nmx],prec[Nmx];
short 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,cst;
for(int i=1;i<=m;++i)
{
scanf("%hd%hd%hd%hd",&x,&y,&c,&cst);
C[x][y]=c;
Cst[x][y]=cst;
Cst[y][x]=-cst;
G[x].push_back(y);
G[y].push_back(x);
}
}
bool dijkstra()
{
for(short i=0;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(short i=0;i<G[nod].size();++i)
if(cost[G[nod][i]]>cost[nod]+Cst[nod][G[nod][i]]&&
C[nod][G[nod][i]]-F[nod][G[nod][i]]>0)
{
cost[G[nod][i]]=cost[nod]+Cst[nod][G[nod][i]];
prec[G[nod][i]]=nod;
if(!viz[G[nod][i]])
{
q.push(G[nod][i]);
viz[G[nod][i]]=1;
}
}
}
if(cost[d]<INF)
return 1;
return 0;
}
void flux()
{
short i;
int sol=0;
while(dijkstra())
{
int Vmin=INF;
for(i=d;i!=s;i=prec[i])
Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
for(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();
flux();
return 0;
}