Pagini recente » Cod sursa (job #2072664) | Cod sursa (job #310144) | Cod sursa (job #1903856) | Cod sursa (job #1995089) | Cod sursa (job #669544)
Cod sursa(job #669544)
#include<fstream>
#include<vector>
#include<queue>
#define inf 10000001
using namespace std;
ofstream g("fmcm.out");
int i,j,n,m,s,d1,xx,yy,cp,c1,r,rez=0,sum=0;
int d[3600],cap[361][361],cost[361][361],fl[361][361],p[361];
bool b[361],uz[361];
vector<int> a[361];
queue<int> q;
inline void bell()
{
int i,x,j,k,ok=0;
for(i=1;i<=n&&!ok;++i)
for(j=1;j<=n;++j)
for(k=0;k<a[j].size();++j)
if(cap[j][a[j][k]]-fl[j][a[j][k]]>0&&d[a[j][k]]>d[j]+cost[j][a[j][k]])
{
d[a[j][k]]=d[j]+cost[j][a[j][k]];
ok=1;
}
/*for(i=1;i<=n;++i)
d[i]=inf,b[i]=0,p[i]=-1;
d[s]=0;
b[s]=1;
q.push(s);
int ok=0;
while(!q.empty())
{
x=q.front();
for(i=0;i<a[x].size();++i)
if(cap[x][a[x][i]]-fl[x][a[x][i]]>0&&d[a[x][i]]>d[x]+cost[x][a[x][i]])
{
d[a[x][i]]=d[x]+cost[x][a[x][i]];
if(!b[a[x][i]])
{
q.push(a[x][i]);
b[a[x][i]]=1;
}
}
b[x]=0;
q.pop();
}*/
sum=d[d1];
}
inline int dijkstra()
{
int i,x,min1,p[361],j;
for(i=1;i<=n;++i)
for(j=0;j<a[i].size();++j)
if(d[i]<inf&&d[a[i][j]]!=inf)
cost[i][a[i][j]]+=d[i]-d[a[i][j]];
for(i=1;i<=n;++i)
d[i]=inf,p[i]=-1,uz[i]=0;
q.push(s);
d[s]=0;
uz[s]=1;
while(!q.empty())
{
x=q.front();
for(i=0;i<a[x].size();++i)
if(cap[x][a[x][i]]>fl[x][a[x][i]]&&d[a[x][i]]>d[x]+cost[x][a[x][i]])
{
d[a[x][i]]=d[x]+cost[x][a[x][i]];
q.push(a[x][i]);
p[a[x][i]]=x;
}
q.pop();
}
min1=inf;
if(d[d1]!=inf)
{
sum+=d[d1];
r=1;
for(i=d1;i!=s;i=p[i])
{
if(min1>cap[p[i]][i]-fl[p[i]][i])
min1=cap[p[i]][i]-fl[p[i]][i];
}
for(i=d1;i!=s;i=p[i])
{
fl[p[i]][i]+=min1;
fl[i][p[i]]-=min1;
}
return sum*min1;
}
return 0;
}
int main()
{
ifstream f("fmcm.in");
f>>n>>m>>s>>d1;
for(i=1;i<=m;++i)
{
f>>xx>>yy>>cp>>c1;
a[xx].push_back(yy);
a[yy].push_back(xx);
cost[xx][yy]=c1;
cost[yy][xx]=-c1;
cap[xx][yy]=cp;
}
bell();
r=1;
while(r)
{
r=0;
rez+=dijkstra();
}
g<<rez<<"\n";
return 0;
}