Pagini recente » Cod sursa (job #526183) | Cod sursa (job #2273573) | Cod sursa (job #2774097) | Cod sursa (job #532688) | Cod sursa (job #305688)
Cod sursa(job #305688)
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define MAX_N 355
#define Inf 0x3f3f3f3f
vector<int>G[MAX_N];
int dist[MAX_N];
int S,D,N,M;
int cst[MAX_N][MAX_N];
int f[MAX_N][MAX_N];
int capac[MAX_N][MAX_N];
int viz[MAX_N];
queue<int>Q;
int tata[MAX_N];
int Sum;
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;
while(!Q.empty())
{
x = Q.front();
viz[x] = 0;
Q.pop();
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("%d%d%d%d",&N,&M,&S,&D);
int i,x,y,capacitate,cost;
for(i=1;i<=M;++i)
{
scanf("%d%d%d%d",&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;
}