Pagini recente » Cod sursa (job #19432) | Cod sursa (job #938478) | Cod sursa (job #324258) | Cod sursa (job #2093639) | Cod sursa (job #243228)
Cod sursa(job #243228)
#include <cstdio>
#include <string>
#define N 351
#define oo 0x3f3f3f3f
int cost[N][N], cap[N][N];
struct nod { int x; nod *n;};
nod *a[N];
int source, sink;
int n, m;
inline void add(int i, int j)
{
nod *p=new nod;
p->x=j;
p->n=a[i];
a[i]=p;
}
inline int bellman()
{
int Q[512], p=0,q=0;
int t[N], d[N];
bool inq[N];
memset(inq, 0, sizeof(inq));
memset(t, 0, sizeof(t));
memset(d, oo, sizeof(d));
d[source]=0;
Q[0]=source;
inq[source]=0;
int nr=1;
int u;
nod *i;
while(nr)
{
u=Q[p];
p=(p+1)&511;
inq[u]=0;
--nr;
for(i = a[u]; i; i=i->n)
if(cap[u][i->x] > 0)
if(d[i->x] > d[u] + cost[u][i->x])
{
d[i->x]=d[u] + cost[u][i->x];
t[i->x]=u;
if(!inq[i->x])
{
q=(q+1)&511;
Q[q]=i->x;
++nr;
}
}
}
if(t[sink] == 0) return 0;
int mn=oo;
for(int i=sink; i != source; i=t[i])
if(cap[t[i]][i] < mn) mn=cap[t[i]][i];
for(int i=sink; i != source; i=t[i])
cap[t[i]][i]-=mn,
cap[i][t[i]]+=mn;
return mn*d[sink];
}
void solve()
{
int sol=0;
while(1)
{
int t=bellman();
if(t==0) break;
sol+=t;
}
freopen("fmcm.out","w",stdout);
printf("%d\n", sol);
return ;
for(int i=1; i<=n; ++i)
for(nod *j=a[i]; j; j=j->n)
if(cap[i][j->x] == 0) sol += cost[i][j->x];
printf("%d\n", sol);
}
int main()
{
freopen("fmcm.in","r",stdin);
scanf("%d %d %d %d\n", &n, &m, &source, &sink);
int p, q, capp, costt;
while(m--)
{
scanf("%d %d %d %d\n", &p, &q, &capp, &costt);
add(p,q);
add(q,p);
cap[p][q]=capp;
cost[p][q]=costt;
cost[q][p]=-costt;
}
solve();
return 0;
}