Pagini recente » Cod sursa (job #2278333) | Cod sursa (job #597010) | Cod sursa (job #368522) | Cod sursa (job #877201) | Cod sursa (job #291713)
Cod sursa(job #291713)
#include <stdio.h>
#include <vector>
using namespace std;
#define maxn 510
#define inf 2000000000
#define ll long long
#define maxx 100010
#define NUME "fmcm"
FILE *in=fopen(NUME".in","r"),*out=fopen(NUME".out","w");
int n,m,s,d;
int drum,l;
vector <int> a[maxn];
int g[maxn],dist[maxn],from[maxn];
int q[maxn],u[maxn];
int c[maxn][maxn],f[maxn][maxn],cost[maxn][maxn];
int bellmanford(){
int i,j,k;
for(i=1;i<=n;i++){
dist[i]=inf;
from[i]=-1;
}
dist[s]=0;
l=1;
q[l]=s;
memset(u,0,sizeof(u));
u[s]=1;
for(i=1;i<=l;i++){
k=q[i];
for(j=0;j<g[k];j++)
if(c[k][a[k][j]]>f[k][a[k][j]]&&dist[k]+cost[k][a[k][j]]<dist[a[k][j]]){
dist[a[k][j]]=dist[k]+cost[k][a[k][j]];
from[a[k][j]]=k;
if(!u[a[k][j]]){
q[++l]=a[k][j];
u[q[l]]=1;
}
}
u[k]=0;
}
if(dist[d]!=inf){
int vmin=inf;
drum=1;
for(i=d;i!=s;i=from[i]) vmin=min(vmin,c[from[i]][i]-f[from[i]][i]);
for(i=d;i!=s;i=from[i]){
f[from[i]][i]+=vmin;
f[i][from[i]]-=vmin;
}
return vmin*dist[d];
}
return 0;
}
void citire(){
int i,x,y,z,cap;
fscanf(in,"%d%d%d%d",&n,&m,&s,&d);
for(i=1;i<=m;i++){
fscanf(in,"%d%d%d%d",&x,&y,&cap,&z);
a[x].push_back(y);
a[y].push_back(x);
c[x][y]=cap;
cost[x][y]=z;
cost[y][x]=-z;
}
for(i=1;i<=n;i++)g[i]=a[i].size();
}
ll flux(){
ll rez=0;
drum=1;
while(drum){
drum=0;
rez+=bellmanford();
}
return rez;
}
int main(){
citire();
fprintf(out,"%lld",flux());
fclose(in);
fclose(out);
return 0;
}