Pagini recente » Cod sursa (job #3002358) | Cod sursa (job #2314590) | Cod sursa (job #3223403) | Cod sursa (job #2584410) | Cod sursa (job #305699)
Cod sursa(job #305699)
#include<cstdio>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
#define MAX_N 355
#define Inf 0x3f3f3f3f
vector<short int>G[MAX_N];
int dist[MAX_N];
short int S,D,N,M;
short int cst[MAX_N][MAX_N];
short int f[MAX_N][MAX_N];
short int capac[MAX_N][MAX_N];
bitset<MAX_N>viz;
queue<int>Q;
int tata[MAX_N];
int Sum;
short int min(const short int &a, const short int &b)
{
return (a>b)?(b):(a);
}
void flux()
{
int x, y, flmin;
unsigned i;
for(;;)
{
Q.push(S);
for(i=1;i<=N;++i)
{
dist[i] = Inf;
viz[i] = 0;
}
dist[S] = 0;
for(;!Q.empty();Q.pop())
{
x = Q.front();
viz[x] = 0;
for(i=0;i<G[x].size();++i)
{
y = G[x][i];
if(f[x][y] < capac[x][y] && dist[y] > dist[x] + cst[x][y])
{
dist[y] = dist[x] + cst[x][y];
tata[y] = x;
if(!viz[y])
{
viz[y] = 1;
Q.push(y);
}
}
}
}
if(dist[D] == Inf) return;
flmin = Inf;
for(i=D;i!=S;i=tata[i])
flmin = min(flmin,capac[tata[i]][i] - f[tata[i]][i]);
if(flmin == 0) continue;
for(i=D;i!=S;i=tata[i])
{
f[tata[i]][i] += flmin;
f[i][tata[i]] -= flmin;
}
Sum += flmin * dist[D];
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%hd%hd%hd%hd",&N,&M,&S,&D);
int i;
short int x,y,capacitate,cost;
for(i=1;i<=M;++i)
{
scanf("%hd%hd%hd%hd",&x,&y,&capacitate,&cost);
cst[x][y] = cost;
cst[y][x] = -cost;
capac[x][y] = capacitate;
G[x].push_back(y);
G[y].push_back(x);
}
flux();
printf("%d\n",Sum);
return 0;
}