Pagini recente » Cod sursa (job #488713) | Cod sursa (job #299686) | Cod sursa (job #2439702) | Cod sursa (job #772928) | Cod sursa (job #1555129)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
#define INF (1<<30)
ifstream in("cmcm.in");
ofstream out("cmcm.out");
vector<int> G[351];
queue<int> q;
int N, M,a,b,c,d,rez;
int T[351], D[351], CAP[351][351], COST[351][351], SOURCE, DEST;
bool viz[351];
void Update(int S,int DEST)
{
int i,j,el;
int mn = INF;
el = DEST;
for (; T[el]; el=T[el])
{
mn = min(mn, CAP[T[el]][el]);
}
el = DEST;
for (; T[el]; el = T[el])
{
if (CAP[T[el]][el] - mn >= 0)
{
CAP[T[el]][el] -= mn;
CAP[el][T[el]] += mn;
}
else
{
CAP[T[el]][el] += mn;
CAP[el][T[el]] -= mn;
}
}
rez += D[DEST] * mn;
}
int BellmanFord(int S,int DEST)
{
int el,i;
for (i = 1; i <= N; ++i)
{
D[i] = INF;
T[i] = 0;
}
D[S] = 0;
memset(viz, 0, sizeof(viz));
viz[S] = 1;
q.push(S);
int ok=0;
while (q.size())
{
el = q.front();
q.pop();
viz[el] = 0;
for (i = 0; i < G[el].size(); ++i)
if (D[el] + COST[el][G[el][i]] < D[G[el][i]] && CAP[el][G[el][i]]>0)
{
D[G[el][i]] = D[el] + COST[el][G[el][i]];
T[G[el][i]] = el;
ok = 1;
if (!viz[G[el][i]])
{
viz[G[el][i]] = 1;
q.push(G[el][i]);
}
}
}
return ok;
}
void EdmondKarp(int S,int DEST)
{
while (BellmanFord(S,DEST))
{
Update(S,DEST);
}
}
int main()
{
in >> N >> M>>SOURCE>>DEST;
for (int i = 1; i <= M; ++i)
{
in >> a >> b >> c >> d;
G[a].push_back(b);
CAP[a][b] = c;
COST[a][b] = d;
COST[b][a] = -d;
}
EdmondKarp(SOURCE, DEST);
out << rez;
return 0;
}