Pagini recente » Cod sursa (job #911946) | Cod sursa (job #346058) | Cod sursa (job #1033339) | Cod sursa (job #1344740) | Cod sursa (job #2469841)
#include <bits/stdc++.h>
#define dim 353
#define inf 100000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
deque <int> q;
vector <int> L[dim];
bool fr[dim];
int Z[dim][dim];
int flux,j,cp,cost,nod;
int C[dim][dim], F[dim][dim],i,p,u,minim,T[dim],n,x,y,s,d,m,gasit,D[dim];
bool bf()
{
memset(fr,0,sizeof(fr));
int nod,vecin,i;
for(i=1; i<=n; i++)
D[i]=inf;
D[s]=0;
gasit=0;
q.clear();
q.push_back(s);
while(!q.empty())
{
nod=q.front();
q.pop_front();
fr[nod]=0;
for(i=0; i<L[nod].size(); i++)
{
vecin=L[nod][i];
if(C[nod][vecin]>F[nod][vecin] && D[vecin] > D[nod]+ Z[nod][vecin])
{
// cout<<1;
D[vecin] = D[nod]+Z[nod][vecin];
T[vecin]=nod;
if(!fr[vecin])
{
q.push_back(vecin);
fr[vecin]=1;
if(vecin==d)
gasit=1;
}
}
}
}
return gasit;
}
int main()
{
fin>>n>>m>>s>>d;
for(i=1; i<=m; i++)
{
fin>>x>>y>>cp>>cost;
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=cp;
Z[x][y]=cost;
Z[y][x]=-cost;
}
while (bf())
{
nod=d;
minim=inf*2;
while(nod!=s)
{
minim=min(minim,C[T[nod]][nod]-F[T[nod]][nod]);
nod=T[nod];
}
nod=d;
while(nod!=s)
{
F[T[nod]][nod] +=minim;
F[nod][T[nod]] -=minim;
nod=T[nod];
}
flux+=minim*D[d];
}
fout<<flux<<"\n";
}