Pagini recente » Cod sursa (job #344106) | Cod sursa (job #1977086) | Cod sursa (job #124338) | Cod sursa (job #294292) | Cod sursa (job #1504813)
#include <cstdio>
#include <bitset>
#include <vector>
#include <bitset>
#include <queue>
#define nmax 355
#define inf 2000000000
using namespace std;
int n,m,source,dest;
int c[nmax][nmax],f[nmax][nmax],p[nmax][nmax];
//Capacitatea unei muchii , fluxul unei muchii , costul unei unitati de flux
int t[nmax],d[nmax],adding;
//Tatal unui nod //Drumul minim pana la un nod
long long cost,l;
vector <int> v[nmax];
bitset <nmax> b;
queue <int> q;
int bfs()
{
for (int i=1;i<=n;i++)
d[i]=inf,t[i]=0;
d[source]=0;
int i,j,r;
q.push(source);
while (!q.empty()) {
i=q.front();
b[i]=0;
q.pop();
for (r=0;r<v[i].size();r++) {
j=v[i][r];
if (c[i][j]-f[i][j]>0&&d[i]+p[i][j]<d[j]) {
d[j]=d[i]+p[i][j];
t[j]=i;
if (b[j]==0) {
b[j]=1;
q.push(j);
}
}
}
}
if (d[dest]<inf/2)
{
int adding=inf;
for (i=dest;i!=source;i=t[i]) adding=min(adding,c[t[i]][i]-f[t[i]][i]);
for (i=dest;i!=source;i=t[i]) {
f[t[i]][i] += adding;
f[i][t[i]] -= adding;
}
return adding*d[dest];
}
return 0;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
int i,j,ok=1;
int x,y,z,k;
scanf("%d %d %d %d",&n,&m,&source,&dest);
//Numarul de noduri , numarul de muchii , nodul sursa , nodul destinatie
for (i=1;i<=m;i++) {
scanf("%d %d %d %d",&x,&y,&z,&k);
v[x].push_back(y);//Adaug muchie de la x la y
v[y].push_back(x);//Adaug muchie de la y la x
c[x][y]=z;
p[x][y]=k;
p[y][x]=-k;
}
while (1) {
l=bfs();
if (l)
cost+=l;
else
break;
}
printf("%d\n",cost);
return 0;
}