Pagini recente » Cod sursa (job #3282799) | Cod sursa (job #757431) | Cod sursa (job #2377042) | Cod sursa (job #147) | Cod sursa (job #1333729)
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
vector<int> v[360];
int ma,cst,viz[352],n,m,S,D,dist[352],pred[352],i,flow[352][352],cost[352][352],a,b;
queue<int> q;
bool bellmanford()
{
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++)
dist[i]=1000000000;
q.push(S);
dist[S]=0;
while(!q.empty())
{
a=q.front();
q.pop();
viz[a]=0;
for(vector<int>::iterator it=v[a].begin();it!=v[a].end();it++)
{
b=*it;
if(dist[b]>dist[a]+cost[a][b]&&flow[a][b])
{
dist[b]=dist[a]+cost[a][b];
pred[b]=a;
if(!viz[b])
{
viz[b]++;
q.push(b);
}
}
}
}
if(dist[D]==1000000000)
return false;
return true;
}
int main()
{
f>>n>>m>>S>>D;
for(i=1;i<=m;i++)
{
f>>a>>b;
f>>flow[a][b]>>cost[a][b];
cost[b][a]=-cost[a][b];
v[a].push_back(b);
v[b].push_back(a);
}
while(bellmanford())
{
ma=1000000000;
a=D;
while(a!=S)
{
if(ma>flow[pred[a]][a])
ma=flow[pred[a]][a];
a=pred[a];
}
a=D;
while(a!=S)
{
flow[pred[a]][a]-=ma;
flow[a][pred[a]]+=ma;
a=pred[a];
}
cst+=ma*dist[D];
}
g<<cst<<'\n';
return 0;
}