Pagini recente » Cod sursa (job #1742589) | Cod sursa (job #3285645) | Cod sursa (job #605943) | Cod sursa (job #2274891) | Cod sursa (job #1163368)
#include<fstream>
#include<list>
#include<vector>
#include<algorithm>
#include<cstring>
#define DMAX 351
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin ("fmcm.in");
ofstream fout("fmcm.out");
list<int> lista;
list<int>::iterator it;
vector< list<int> >l(DMAX,lista);
int n,m,x,y,c,z,s,d,flxmin,flux,i;
int flx[DMAX][DMAX],cost[DMAX][DMAX],cap[DMAX][DMAX],viz[DMAX],dad[DMAX],que[DMAX],dist[DMAX];
int f()
{
int ls=0,ld=0;
for(i=1;i<=n;++i)
{
viz[i]=dad[i]=0;
dist[i]=INF;
}
que[0]=s; viz[s]=1; dist[s]=0;
while(ls<=ld)
{
x=que[ls++];
for(it=l[x].begin();it!=l[x].end();++it)
{
y=*it;
if(cap[x][y]>flx[x][y] && dist[y]>dist[x]+cost[x][y])
{
dist[y]=dist[x]+cost[x][y];
dad[y]=x;
if(!viz[y])
{
que[++ld]=y;
viz[y]=1;
}
}
}
viz[x]=0;
}
if(dist[d]==INF)
return 0;
flux=INF;
for(i=d;i!=s;i=dad[i])
flux=min(flux,cap[dad[i]][i]-flx[dad[i]][i]);
if(flux!=INF)
{
for(i=d;i!=s;i=dad[i])
{
flx[dad[i]][i]+=flux;
flx[i][dad[i]]-=flux;
}
flxmin+=flux*dist[d];
}
return 1;
}
int main()
{
fin>>n>>m>>s>>d;
for(i=1;i<=m;++i)
{
fin>>x>>y>>c>>z;
l[x].push_back(y);
l[y].push_back(x);
cap[x][y]=c;
cost[x][y]=z;
cost[y][x]=-z;
}
while(f());
fout<<flxmin;
return 0;
}