Pagini recente » Cod sursa (job #1760968) | Cod sursa (job #1529609) | Cod sursa (job #2250315) | Cod sursa (job #2721393) | Cod sursa (job #1211931)
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define NMAX 352
#define INF 2000000000
int n,m,d,s,mini=2000;
int f[NMAX][NMAX],t[NMAX],val[NMAX],cost[NMAX][NMAX];
bool fv[NMAX][NMAX];
struct nodc
{
int x,c;
}nod,fiu;
vector<int>v[NMAX];
struct cmp
{
bool operator()(const nodc &a,const nodc &b)
{
return a.c>b.c;
}
};
priority_queue<nodc,vector<nodc>, cmp> q;
bool drum()
{
int i;
memset(t,0,sizeof(t));
for(i=0;i<NMAX;++i)
val[i]=-INF;
while(!q.empty())
q.pop();
nod.x=s;
nod.c=0;
q.push(nod);
t[s]=s;
val[s]=mini;
while(!q.empty())
{
nod=q.top();
q.pop();
for(i=0;i<v[nod.x].size();++i)
{
fiu.x=v[nod.x][i];
fiu.c=nod.c+cost[nod.x][fiu.x];
if(f[fiu.x][nod.x] && t[fiu.x]==0 && (val[fiu.x]==-INF ||val[fiu.x]>fiu.c))
{
val[fiu.x]=fiu.c;
t[fiu.x]=nod.x;
if(fiu.x == d)
return 1;
q.push(fiu);
}
}
}
return 0;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
int i,j,x,y,cap,ct,maxc,sol=0;
scanf("%d%d%d%d",&n,&m,&s,&d);
for(i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x,&y,&cap,&ct);
v[x].push_back(y);
v[y].push_back(x);
f[y][x]=cap;
cost[x][y]=ct;
cost[y][x]=-ct;
if(ct<mini)mini=ct;
if(-ct<mini)mini=-ct;
}
if(mini<0)
{
mini=-mini+1;
for(i=1;i<=n;++i)
for(j=i+1;j<=n;++j)
{
cost[i][j]+=mini;
cost[j][i]+=mini;
}
}else
mini=0;
while(drum())
{
maxc=INF;
for(i=d;i!=s;i=t[i])
if(f[i][t[i]]<maxc)
maxc=f[i][t[i]];
for(i=d;i!=s;i=t[i])
{
f[i][t[i]]-=maxc;
f[t[i]][i]+=maxc;
if(!fv[t[i]][i])
{
fv[t[i]][i]=1;
//sol+=cost[t[i]][i]-mini;
}
}
sol+=maxc;
}
printf("%d\n",sol);
return 0;
}