Pagini recente » Cod sursa (job #1307334) | Statistici Eliza Popa (elizapopa13) | Cod sursa (job #1310885) | Cod sursa (job #1596582) | Cod sursa (job #1825798)
#include <cstdio>
#include <vector>
#include <cstring>
#include <cctype>
#define MAXN 350
#define INF 1000000000
#define MAXQ (1<<18)
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1];
int cost[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int from[MAXN+1];
bool inQ[MAXN+1];
int dist[MAXN+1];
int q[MAXQ];
inline int BF(int S,int D,int n){
int b,e,i,x,nod;
for(i=1;i<=n;i++)
dist[i]=INF;
memset(from,0,sizeof(from));
dist[S]=0;
inQ[S]=1;
b=0;
e=1;
q[b]=S;
while(b!=e){
nod=q[b];
inQ[nod]=0;
for(auto x:G[nod])
if(dist[x]>dist[nod]+cost[nod][x]&&cap[nod][x]>flux[nod][x]){
dist[x]=dist[nod]+cost[nod][x];
from[x]=nod;
if(inQ[x]==0){
inQ[x]=1;
q[e]=x;
e++;
e&=(MAXQ-1);
}
}
b++;
b&=(MAXQ-1);
}
return dist[D];
}
int main(){
FILE*fi,*fout;
int n,m,S,D,nod,ans,min,x,y,z,c,i;
fi=fopen("fmcm.in" ,"r");
fout=fopen("fmcm.out" ,"w");
fscanf(fi,"%d %d %d %d " ,&n,&m,&S,&D);
for(i=1;i<=m;i++){
fscanf(fi,"%d %d %d %d " ,&x,&y,&c,&z);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y]=c;
cost[x][y]=z;
cost[y][x]=-z;
}
ans=0;
while(BF(S,D,n)<INF){
nod=D;
min=INF;
while(from[nod]>0){
if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
min=cap[from[nod]][nod]-flux[from[nod]][nod];
nod=from[nod];
}
nod=D;
while(from[nod]>0){
flux[from[nod]][nod]+=min;
flux[nod][from[nod]]-=min;
nod=from[nod];
}
ans+=min*dist[D];
}
fprintf(fout,"%d" ,ans);
fclose(fi);
fclose(fout);
return 0;
}