Pagini recente » Cod sursa (job #1724813) | Cod sursa (job #2415270) | Cod sursa (job #2335096) | Cod sursa (job #893504) | Cod sursa (job #2842957)
#include <bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n,tata[355],dist[355],viz[355];
int flux[355][355],c[355][355];
vector <pair <int,int>> gr[355];
bool ok(int start, int dest)
{
int i;
for (i=1;i<=n;i++)
{
tata[i]=-1;
dist[i]=1e9;
viz[i]=0;
}
queue <int> q;
tata[start]=0;
dist[start]=0;
q.push(start);
while (!q.empty())
{
int acum = q.front();
q.pop();
viz[acum]=0;
for (int i=0;i<gr[acum].size();i++)
{
int nod = gr[acum][i].first;
if (flux[acum][nod]<c[acum][nod]&&dist[nod]>dist[acum]+gr[acum][i].second)
{
tata[nod]=acum;
dist[nod]=dist[acum]+gr[acum][i].second;
if (viz[nod]==0)
{
viz[nod]=1;
q.push(nod);
}
}
}
}
if (dist[dest]!=1e9)
{
return 1;
}
return 0;
}
int m,st,dest,i,x,y,cap,cost,suma,ceau;
int main()
{
f>>n>>m>>st>>dest;
for (i=1;i<=m;i++)
{
f>>x>>y>>cap>>cost;
gr[x].push_back({y,cost});
gr[y].push_back({x,-cost});
c[x][y]=cap;
}
while (ok(st,dest))
{
int nod = dest;
ceau = c[tata[nod]][nod]-flux[tata[nod]][nod];
while (tata[nod]!=0)
{
ceau=min(ceau,c[tata[nod]][nod]-flux[tata[nod]][nod]);
nod=tata[nod];
}
suma=suma+ceau*dist[dest];
nod = dest;
while (tata[nod]!=0)
{
flux[tata[nod]][nod]+=ceau;
flux[nod][tata[nod]]-=ceau;
nod=tata[nod];
}
}
g<<suma;
return 0;
}