Pagini recente » Cod sursa (job #3152144) | Cod sursa (job #422593) | Cod sursa (job #2279386) | Cod sursa (job #2564032) | Cod sursa (job #726979)
Cod sursa(job #726979)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define MAXN 400
using namespace std;
queue<int>Q;
long long cost;
int dist[MAXN],Cost[MAXN][MAXN],F[MAXN][MAXN],C[MAXN][MAXN],p[MAXN],fmin,s,d,n,m;
vector<int>v[MAXN];
bool inq[MAXN];
bool drum()
{
int i,x;
memset(p,0,sizeof(p));
for(i=1;i<=n;i++) dist[i]=(int(2e9));
dist[s]=0;
inq[s]=1; Q.push(s);
while(!Q.empty())
{
x=Q.front(); inq[x]=0; Q.pop();
for(i=0;i<v[x].size();i++)
if(dist[v[x][i]]>dist[x]+Cost[x][v[x][i]] and F[x][v[x][i]]-C[x][v[x][i]]<0)
{
dist[v[x][i]]=dist[x]+Cost[x][v[x][i]];
p[v[x][i]]=x;
if(!inq[v[x][i]])
{
inq[v[x][i]]=1;
Q.push(v[x][i]);
}
}
}
return (p[d]!=0);
}
int main()
{
int x,y,z,t,i;
ifstream fi("fmcm.in");
ofstream fo("fmcm.out");
fi>>n>>m>>s>>d;
for(i=1;i<=m;i++)
{
fi>>x>>y>>z>>t;
v[x].push_back(y);
v[y].push_back(x);
Cost[x][y]=t; Cost[y][x]=-t;
C[x][y]=z;
}
while(drum())
{
fmin=int(2e9);
for(i=d;i!=s;i=p[i])
fmin=min(fmin,C[p[i]][i]-F[p[i]][i]);
for(i=d;i!=s;i=p[i])
{
F[p[i]][i]+=fmin;
F[i][p[i]]-=fmin;
}
cost+=dist[d]*fmin;
}
fo<<cost<<"\n";
return 0;
}