Pagini recente » Cod sursa (job #111374) | Cod sursa (job #692092) | Cod sursa (job #846875) | Cod sursa (job #2991298) | Cod sursa (job #1684798)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 359;
int n , m , a , b , v , p , i;
class network
{
private :
int flow[nmax][nmax];
int price[nmax][nmax];
int volume[nmax][nmax];
vector < int > g[nmax];
int link[nmax] , len[nmax] , in[nmax];
queue < int > iq;
bool path()
{
int i , r , x;
for (i = 1 ; i <= n ; ++i)
len[i] = (1 << 30) , link[i] = 0 , in[i] = 0;
iq.push(source) , in[source] = 1 , len[source] = 0;
while (iq.size())
{
x = iq.front();
iq.pop();
in[x] = 0;
for (int i = 0 ; i < g[x].size() ; ++i)
{
r = g[x][i];
if (len[x] + price[x][r] < len[r] && volume[x][r] > flow[x][r])
{
len[r] = len[x] + price[x][r];
link[r] = x;
if (in[r]);
else iq.push(r) , in[r] = 1;
}
}
}
return link[sink];
}
public :
int answer , source , sink , n;
void add(int a , int b , int v , int p)
{
g[a].push_back(b);
g[b].push_back(a);
volume[a][b] = v;
price[a][b] = p;
price[b][a] = -p;
}
void work()
{
int t , i;
while (path())
{
t = (1 << 30);
for (i = sink ; i - source ; i = link[i])
t = min(t , volume[link[i]][i] - flow[link[i]][i]);
answer += t * len[sink];
for (i = sink ; i - source ; i = link[i])
{
flow[link[i]][i] += t;
flow[i][link[i]] -= t;
}
}
}
} solve;
int main()
{
freopen("fmcm.in" , "r" , stdin);
freopen("fmcm.out" , "w" , stdout);
scanf("%d" , &n);
scanf("%d" , &m);
scanf("%d" , &solve.source);
scanf("%d" , &solve.sink);
for (i = 1 ; i <= m ; ++i)
{
scanf("%d" , &a);
scanf("%d" , &b);
scanf("%d" , &v);
scanf("%d" , &p);
solve.add(a , b , v ,p);
}
solve.n = n;
solve.work();
printf("%d\n" , solve.answer);
return 0;
}