Pagini recente » Cod sursa (job #1544293) | Cod sursa (job #1133334) | Cod sursa (job #3137488) | Cod sursa (job #3281557) | Cod sursa (job #703058)
Cod sursa(job #703058)
#include<fstream>
#include<queue>
#include<cstring>
#include<climits>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int a,b,n,m,j,i,s,d,c,costmin,cc[355],viz[1001],z,tata[355],cost[355][355],cap[355][355],fluxmax,flux[355][355];
struct nod
{
int x;
nod *next;
} *v[355],*p;
queue<int> q;
int bf()
{
int w,vecin;
memset(viz,0,sizeof(viz));
memset(tata,0,sizeof(tata));
for(i=1;i<=n;++i) cc[i]=INT_MAX;
q.push(s);
viz[s]=1;
cc[s]=0;
while(!q.empty())
{
w=q.front();
p=v[w];
viz[w]=0;
q.pop();
while(p)
{
vecin=p->x;
if( (cc[vecin]>cc[w]+cost[w][vecin] )&&flux[w][vecin]<cap[w][vecin])
{
if(!viz[vecin]) q.push(vecin),viz[vecin]=1;
tata[vecin]=w;
cc[vecin]=cc[w]+cost[w][vecin];
}
p=p->next;
}
}
return (cc[d]<INT_MAX);
}
int main()
{
f>>n>>m>>s>>d;
for(i=1;i<=m;i++)
{
f>>a>>b>>c>>z;
p=new nod;
p->x=b;
p->next=v[a];
v[a]=p;
p=new nod;
p->x=a;
p->next=v[b];
v[b]=p;
cap[a][b]=c;
cost[a][b]=z;
cost[b][a]=-z;
}
while(bf())
{
//for(i=1;i<=n;++i) g<<cc[i]<<' ';
//g<<'\n';
int minim=cap[tata[d]][d]-flux[tata[d]][d];
//if(!minim) return 1;
for(j=tata[d];j!=s;j=tata[j])
if(minim>cap[tata[j]][j]-flux[tata[j]][j]) minim=cap[tata[j]][j]-flux[tata[j]][j];
flux[tata[d]][d]+=minim;
flux[d][tata[d]]-=minim;
costmin+=minim*cc[d];
for(j=tata[d];j!=s;j=tata[j])
{
flux[tata[j]][j]+=minim;
flux[j][tata[j]]-=minim;
}
fluxmax+=minim;
}
g<<costmin<<'\n';
f.close();
g.close();
return 0;
}