Pagini recente » Cod sursa (job #3247639) | Cod sursa (job #2620070) | Cod sursa (job #2786429) | Cod sursa (job #2898084) | Cod sursa (job #940116)
Cod sursa(job #940116)
#include <fstream>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
#define inf 1<<30
#include <queue>
#define LE 350
int i,n,m,S,D,xx,yy;
int cp,di;
queue<int> que;
bool vd[LE][LE];
int dist[LE][LE],flux[LE][LE],cap[LE][LE];
int source,fcost;
bool viz[LE],still=true;
int dp[LE],father[LE];
void blmf()
{
while (!que.empty())
que.pop();
que.push(source);
for(int i=1; i<=n; ++i)
viz[i]=false;
while (que.empty()==false)
{
int nod=que.front();
que.pop();
for(int i=1; i<=n; ++i)
if (vd[nod][i]&&(viz[i]==false||dp[i]>dp[nod]+dist[nod][i]))
if (cap[nod][i]-flux[nod][i]>0)
{
viz[i]=true;
dp[i]=dp[nod]+dist[nod][i];
father[i]=nod;
que.push(i);
}
}
still=viz[D];
}
int main()
{
f>>n>>m>>source>>D;
for(i=1; i<=m; ++i)
{
f>>xx>>yy>>cp>>di;
dist[xx][yy]=di;
dist[yy][xx]=-di;
cap[xx][yy]=cp;
vd[xx][yy]=vd[yy][xx]=true;
}
while (still)
{
still=false;
blmf();
int final=D;
int fmax=inf;
if (still==false)
continue;
while (final!=source)
{
fmax=min(fmax,cap[father[final]][final]-flux[father[final]][final]);
final=father[final];
}
final=D;
while (final!=source)
{
flux[father[final]][final]+=fmax;
flux[final][father[final]]-=fmax;
final=father[final];
}
fcost+=(fmax*dp[D]);
}
g<<fcost<<'\n';
f.close();
g.close();
return 0;
}