Pagini recente » Cod sursa (job #1582251) | Cod sursa (job #259200) | Cod sursa (job #1757681) | Cod sursa (job #937660) | Cod sursa (job #1687861)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 350 + 10;
const int inf = 0x3f3f3f3f;
int n , m , i , S , D , mincost;
int dad[nmax] , bst[nmax];
int c[nmax][nmax] , f[nmax][nmax] , p[nmax][nmax];
bool used[nmax];
vector < int > g[nmax];
queue < int > q;
void add(int x , int y , int C , int P)
{
g[x].push_back(y);
g[y].push_back(x);
c[x][y] = C;
p[x][y] = P; p[y][x] = -P;
}
bool bfs()
{
memset(dad , -1 , sizeof(dad));
memset(bst , inf , sizeof(bst));
memset(used , 0 , sizeof(used));
q.push(S); used[S] = 1; bst[S] = 0; dad[S] = -2;
while (q.size())
{
int node = q.front(); q.pop();
used[node] = 0;
for (auto &it : g[node])
{
if (c[node][it] > f[node][it]); else continue;
if (bst[it] > bst[node] + p[node][it])
{
dad[it] = node;
bst[it] = bst[node] + p[node][it];
if (!used[it])
used[it] = 1, q.push(it);
}
}
}
return (dad[D] != -1);
}
void bagaflux()
{
while (bfs())
{
int minn = inf;
for (int node = D; node != S; node = dad[node])
minn = min(minn , c[dad[node]][node] - f[dad[node]][node]);
if (minn <= 0) continue; ///plm
mincost += bst[D] * minn;
for (int node = D; node != S; node = dad[node])
f[dad[node]][node] += minn,
f[node][dad[node]] -= minn;
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d %d %d %d", &n, &m, &S, &D);
for (i = 1; i <= m; ++i)
{
int x , y , z , t;
scanf("%d %d %d %d", &x, &y, &z, &t);
add(x , y , z , t);
}
bagaflux();
printf("%d\n", mincost);
return 0;
}