Pagini recente » Cod sursa (job #1590830) | Istoria paginii runda/baraj2010 | Cod sursa (job #2532457) | Cod sursa (job #228833) | Cod sursa (job #1504804)
#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;
int bfs()
{
for (int i=1;i<=n;i++)
d[i]=inf,t[i]=0;
d[source]=0;
int i,j,stop=0;
while (!stop)
{
stop=1;
for (i=1;i<=n;i++)
for (j=0;j<v[i].size(); j++)
if (c[i][v[i][j]]-f[i][v[i][j]]>0 &&d[i]+p[i][v[i][j]]<d[v[i][j]])
{
d[v[i][j]]=d[i]+p[i][v[i][j]];
t[v[i][j]]=i;
stop=0;
}
}
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;
}