Pagini recente » Cod sursa (job #3220563) | Cod sursa (job #3206812) | Cod sursa (job #2377359) | Cod sursa (job #205360) | Cod sursa (job #2877120)
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int di[355],dist[355],dist2[355],cost[355][355],C[355][355],F[355][355],n,m,s,d,x,y,c,z,tata[355],sol,FC,viz[355];
priority_queue<pair<int,int>, vector<pair<int,int> >, greater< pair<int,int> > >h;
vector<int>v[355];
int dijkstra()
{
int nod,i,vec,cst;
for(i=1; i<=n; i++)
{
tata[i]=0;
di[i]=inf;
}
h.push({0,s});
di[s]=dist2[s]=0;
tata[s]=-1;
while(!h.empty())
{
cst=h.top().first;
nod=h.top().second;
h.pop();
if(cst!=di[nod] || nod==d) continue;
for(i=0; i<v[nod].size(); i++)
{
vec=v[nod][i];
if(di[vec]>cst+cost[nod][vec]+dist[nod]-dist[vec]&&C[nod][vec]>F[nod][vec])
{
tata[vec]=nod;
di[vec]=cst+cost[nod][vec]+dist[nod]-dist[vec];
dist2[vec]=dist2[nod]+cost[nod][vec];
h.push({di[vec],vec});
}
}
}
for(int i=1; i<=n; i++) dist[i]=dist2[i];
if(tata[d]) return 1;
return 0;
}
void bellmanford()
{
int i,nod,cst,vec;
for(i=1;i<=n;i++) dist[i]=inf;
dist[s]=0;
viz[s]=1;
queue<int>q;
q.push(s);
while(!q.empty())
{
nod=q.front();
q.pop();
viz[nod]=0;
for(i=0;i<v[nod].size();i++)
{
vec=v[nod][i];
cst=cost[nod][vec];
if(dist[vec]>cst+dist[nod]&&C[nod][vec]>F[nod][vec])
{
dist[vec]=cst+dist[nod];
if(vec!=d&&!viz[vec]) {viz[vec]=1;q.push(vec);}
}
}
}
}
int main()
{
int i;
f>>n>>m>>s>>d;
for(i=1; i<=m; i++)
{
f>>x>>y>>c>>z;
v[x].push_back(y);
v[y].push_back(x);
C[x][y]=c;
cost[x][y]=z;
cost[y][z]=-z;
}
bellmanford();
while(dijkstra())
{
g<<'\n';
FC=inf;
for(i=d; i!=s; i=tata[i]) FC=min(FC,C[tata[i]][i]-F[tata[i]][i]);
for(i=d; i!=s; i=tata[i])
{
F[tata[i]][i]+=FC;
F[i][tata[i]]-=FC;
sol+=FC*cost[tata[i]][i];
}
}
g<<sol;
return 0;
}