Pagini recente » Cod sursa (job #2063888) | Cod sursa (job #2339281) | Cod sursa (job #468425) | Cod sursa (job #1405109) | Cod sursa (job #1022352)
#include <cstdio>
#include <cstdlib>
#include <vector>
#define inf 1000000000
using namespace std;
vector<short int>v[400],v1[400];
int t[400],s[400],c1[400][400],c2[400][400],c3[400][400],dist[400];
char atins[400];
int n,m,a1,a2,a3,a4,x,y,nod,i,j,lim,q,sol,sol1;
void mf()
{
int i,j,nod,lim;
sol=1;
for(i=1;i<=n;i++)
{
s[i]=inf;
atins[i]=0;
}
s[x]=0;
while(n)
{
sol=inf;
i=0;
for(j=1;j<=n;j++)
{
if(s[j]<sol && atins[j]==0)
{
sol=s[j];
i=j;
}
}
if(i==0)break;
atins[i]=1;
lim=v[i].size();
for(j=0;j<lim;j++)
{
nod=v[i][j];
if(c1[i][nod]-c3[i][nod] && s[i]+dist[i]+c2[i][nod]-dist[nod]<s[nod])
{
s[nod]=s[i]+dist[i]+c2[i][nod]-dist[nod];
t[nod]=i;
}
}
}
}
int main()
{
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
scanf("%d%d%d%d",&n,&m,&x,&y);
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
v[a1].push_back(a2);
v[a2].push_back(a1);
v1[a1].push_back(a2);
c1[a1][a2]=a3;
c2[a1][a2]=a4;
c1[a2][a1]=0;
c2[a2][a1]=-a4;
}
for(i=1;i<=n;i++) dist[i]=inf;
dist[x]=0;
for(i=1;i<n;i++)
{
a1=0;
for(j=1;j<=n;j++)
{
lim=v1[j].size();
for(q=0;q<lim;q++)
if(dist[j]+c2[j][v1[j][q]]<dist[v1[j][q]])
{
a1=1;
dist[v1[j][q]]=dist[j]+c2[j][v1[j][q]];
}
}
if(a1==0) break;
}
sol1=0;
while(n)
{
mf();
if(s[y]<inf)
{
a1=inf;
for(i=y;i!=x;i=t[i])
{
a1=min(a1,c1[t[i]][i]-c3[t[i]][i]);
}
for(i=y;i!=x;i=t[i])
{
c3[t[i]][i]+=a1;
c3[i][t[i]]-=a1;
sol1+=a1*c2[t[i]][i];
}
}
else break;
}
printf("%d",sol1);
fclose(stdin);
fclose(stdout);
return 0;
}