Pagini recente » Cod sursa (job #1120148) | Cod sursa (job #3142205) | Cod sursa (job #1487057) | Cod sursa (job #1621464) | Cod sursa (job #933063)
Cod sursa(job #933063)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
#define NMAX 355
#define INF 1999999999
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int N,M,S,D , C[NMAX][NMAX], F[NMAX][NMAX], dst[NMAX], cst[NMAX][NMAX],T[NMAX],afis;
struct cmp{
bool operator () (int x,int y)
{
return dst[x]>dst[y];
}
};
vector<int>L[NMAX];
priority_queue<int,vector<int>,cmp>q;
int drum()
{
for (int i=1;i<=N;i++) dst[i]=INF;
dst[S]=0;
q.push(S);
int nod=0,ad=0;
while ( !q.empty() )
{
nod=q.top();
q.pop();
for (int i=0;i<L[nod].size();i++)
{
ad=L[nod][i];
if (C[nod][ad]-F[nod][ad]<=0) continue;
if (dst[ad]>dst[nod]+cst[nod][ad] )
{dst[ad]=dst[nod]+cst[nod][ad];
T[ad]=nod;
q.push(ad);
}
}
}
if (dst[D]==INF) return 0;
return 1;
}
int main()
{
f>>N>>M>>S>>D;
int x,y,c,z;
for (int i=1;i<=M;i++)
{
f>>x>>y>>c>>z;
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=c;
cst[x][y]=z;
cst[y][x]=-z;
}
int fmin;
while ( drum() )
{
fmin=INF;
for (int i=D;i!=S;i=T[i])
fmin=min(fmin,C[T[i]][i]-F[T[i]][i]);
for (int i=D;i!=S;i=T[i])
{
F[T[i]][i] += fmin;
F[i][ T[i] ] -= fmin;
}
afis+=dst[D]*fmin;
}
g<<afis;
return 0;
}