Pagini recente » Cod sursa (job #2150722) | Cod sursa (job #1022547) | Cod sursa (job #1129761) | Cod sursa (job #1935765) | Cod sursa (job #1157107)
#include<fstream>
#include<algorithm>
#include<cstring>
#define fi first
#define se second
#include<queue>
#define INF 0x3f3f3f3f
#include<vector>
#define N 400
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
queue<short int> Q;
vector<pair<short int,short int> > v[N];
pair<short int,short int> des;
short int Cp[N][N],T[N],F[N][N];
bool inQ[N];
int qsize,i,n,m,minim,cost,nod,S,D,c,z,x,y,C[N];
inline void read()
{
f>>n>>m>>S>>D;
FOR(i,1,m)
{
f>>x>>y>>c>>z;
Cp[x][y]=c;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,-z));
}
}
inline void init()
{
memset(inQ,0,sizeof(inQ));
memset(C,INF,sizeof(C));
qsize=1; Q.push(S); inQ[S]=1;
C[S]=0; minim=INF;
}
inline bool fmcm()
{
init();
while(qsize)
{
nod=Q.front();
Q.pop();
qsize--;
inQ[nod]=0;
FOR(i,0,v[nod].size()-1)
{
des=v[nod][i];
if(Cp[nod][des.fi]>F[nod][des.fi]&&C[des.fi]>C[nod]+des.se)
{
C[des.fi]=C[nod]+des.se;
T[des.fi]=nod;
if(!inQ[des.fi])
{
inQ[des.fi]=1;
Q.push(des.fi);
++qsize;
}
}
}
}
if(C[D]!=INF)
{
for(nod=D;T[nod];nod=T[nod])
minim=min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
for(nod=D;T[nod];nod=T[nod])
{
F[T[nod]][nod]+=minim;
F[nod][T[nod]]-=minim;
}
}
return (C[D]!=INF);
}
inline void solve()
{
while(fmcm())
cost+=minim*C[D];
g<<cost;
}
int main ()
{
read();
solve();
return 0;
}