Pagini recente » Cod sursa (job #1069800) | Cod sursa (job #2067476) | Cod sursa (job #2660792) | Cod sursa (job #393245) | Cod sursa (job #931771)
Cod sursa(job #931771)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define MAX 651
#define pb push_back
#define INF 1000000
#define mp make_pair
int N ,M ,S,D , d[MAX],f[MAX][MAX] , c[MAX][MAX] , p[MAX] , fmin;
vector<pair<int,int> > G[MAX];
queue<int> Q;
bool inq[MAX];
long long cost;
void citire();
void solve();
bool b_ford();
void tipar();
int main()
{
citire();
solve();
tipar();
return 0;
}
void citire()
{
int y , z , cap , x;
freopen("fmcm.in" , "r" , stdin);
scanf("%d%d%d%d" , &N ,&M , &S ,&D);
for(;M;--M)
{
scanf("%d%d%d%d" , &x ,&y , &cap , &z);
G[x].pb(mp(y,z));
G[y].pb(mp(x,-z));
c[x][y] = cap;
}
}
void solve()
{
while(b_ford())
{
fmin = INF;
for(int nod = D ; nod !=S ; nod = p[nod])
fmin = min(fmin,c[p[nod]][nod]-f[p[nod]][nod]);
for(int nod = D ; nod !=S ; nod = p[nod])
{
f[p[nod]][nod] += fmin;
f[nod][p[nod]] -=fmin;
}
cost+=d[D]*fmin;
}
}
bool b_ford()
{
for(int i = 1 ; i <= N ; ++i )d[i] = INF;
memset(inq,0,sizeof(inq));
d[S] = 0;inq[S] = 1;
Q.push(S);
for(;!Q.empty();Q.pop())
{
int n = Q.front();
inq[n] = 0;
if(n==D)continue;
for(int j = 0 ; j <(int)G[n].size() ; ++j )
{
int next = G[n][j].first;
int cost = G[n][j].second;
if(f[n][next] == c[n][next])continue;
if(d[n]+cost<d[next])
{
p[next] = n;
d[next] = d[n] +cost;
if(inq[next])continue;
inq[next] = 1;
Q.push(next);
}
}
}
return (d[D]!=INF);
}
void tipar()
{
freopen("fmcm.out" , "w" , stdout);
printf("%lld\n" , cost);
}