Pagini recente » Cod sursa (job #1630699) | Cod sursa (job #2843522) | Cod sursa (job #1769589) | Cod sursa (job #2858207) | Cod sursa (job #250632)
Cod sursa(job #250632)
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <bitset>
#define N 355
#define M 12005
#define inf 2147000000
using namespace std;
struct muchie{int x,y;};
int n,m,S,dest,i,x,y,z,w,flux,costflux,minim,aux;
int g[N],d[N],path[N],t[N],cap[N][N],cost[N][N];
muchie a[M];
int *v[N];
void bellman(){
queue<int>Q; bitset<N>iq; int nod;
for (i=1;i<=N;++i)d[i]=inf;
d[S]=0;
Q.push(S);iq[S]=1;
while (!Q.empty()){
nod=Q.front(); Q.pop();
iq[nod]=0;
for (i=0;i<g[nod];++i)
if (cap[nod][v[nod][i]])
if (d[nod]+cost[nod][v[nod][i]] < d[v[nod][i]]){
d[v[nod][i]]=d[nod]+cost[nod][v[nod][i]];
t[v[nod][i]]=nod;
if (!iq[v[nod][i]]){
Q.push(v[nod][i]);
iq[v[nod][i]]=1;
}
}
}
}
int main(){
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d %d %d %d",&n,&m,&S,&dest);
for (i=1;i<=m;++i){
scanf("%d %d %d %d",&x,&y,&z,&w);
g[x]++;g[y]++;
cap[x][y]=z;
cost[x][y]=w;
cost[y][x]=-w;
a[i].x=x;a[i].y=y;
}
for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
for (i=1;i<=m;++i){
x=a[i].x;y=a[i].y;
v[x][g[x]++]=y;
v[y][g[y]++]=x;
}
//////// calculare flux ///////
flux=0;
do{
bellman();
if (d[dest]==inf)break;
m=0;aux=dest;
while (aux!=0){path[++m]=aux;aux=t[aux];}
minim=inf;
for (i=1;i<m;++i)
if (cap[path[i+1]][path[i]]<minim) minim=cap[path[i+1]][path[i]];
for (i=1;i<m;++i){
cap[path[i+1]][path[i]]-=minim;
cap[path[i]][path[i+1]]+=minim;
}
flux+=minim;
costflux+=minim*d[dest];
}while(1);
printf("%ld\n",costflux);
return 0;
}