Pagini recente » Cod sursa (job #1493343) | Cod sursa (job #2659595) | Cod sursa (job #2056886) | Cod sursa (job #675916) | Cod sursa (job #2849584)
#include <bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int tata[500],distrel[500],distanta[500],n,sel[500],flux[500][500],costDij[500][500];
vector <int> v[500];
int distb[500][500],cap[500][500],cost[500][500];
priority_queue <pair <int,int> , vector <pair <int,int>> ,greater <pair <int,int>> > h;
bool ok(int sursa,int destinatie)
{
int i;
for (i=1;i<=n;i++)
{
tata[i]=-1;
distrel[i]=1e9;
distanta[i]=1e9;
sel[i]=0;
}
tata[sursa]=0;
distrel[sursa]=distanta[sursa]=0;
h.push({distanta[sursa],sursa});
while (!h.empty())
{
while (!h.empty()&&sel[h.top().second])
{
h.pop();
}
if (h.empty())
{
break;
}
int acum = h.top().second;
sel[acum]=1;
h.pop();
for (int i=0;i<v[acum].size();i++)
{
int nod = v[acum][i];
if (cap[acum][nod]-flux[acum][nod]<=0)
{
continue;
}
if (distanta[nod]>distanta[acum]+costDij[acum][nod])
{
tata[nod]=acum;
distanta[nod]=distanta[acum]+costDij[acum][nod];
distrel[nod]=distrel[acum]+cost[acum][nod];
h.push({distanta[nod],nod});
}
}
}
if (distanta[destinatie]==1e9)
{
return 0;
}
return 1;
}
int m,sursa,destinatie,i,x,y,c,z,distB[500],viz[500],nod;
int main()
{
f>>n>>m>>sursa>>destinatie;
for (i=1;i<=m;i++)
{
f>>x>>y>>c>>z;
v[x].push_back(y);
v[y].push_back(x);
cost[x][y]=z;
cost[y][x]=-z;
cap[x][y]=c;
}
for (i=1;i<=n;i++)
{
distB[i]=1e9;
}
distB[sursa]=0;
queue <int> q;
q.push(sursa);
while (!q.empty())
{
int acum = q.front();
viz[acum]=0;
q.pop();
for (i=0;i<v[acum].size();i++)
{
int nod = v[acum][i];
if (flux[acum][nod]<cap[acum][nod])
if (distB[nod]>distB[acum]+cost[acum][nod])
{
distB[nod]=distB[acum]+cost[acum][nod];
if (viz[nod]==0)
{
viz[nod]=1;
q.push(nod);
}
}
}
}
for (i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (i==j)
{
continue;
}
costDij[i][j] = cost[i][j]+distB[i]-distB[j];
}
}
long long costfinal=0;
while (ok(sursa,destinatie))
{
nod=destinatie;
int sal = cap[tata[destinatie]][destinatie]-flux[tata[destinatie]][destinatie];
while (tata[nod]!=0)
{
sal = min (cap[tata[nod]][nod]-flux[tata[nod]][nod],sal);
nod=tata[nod];
}
costfinal += sal*distrel[destinatie];
nod=destinatie;
while (tata[nod]!=0)
{
flux[tata[nod]][nod]+=sal;
flux[nod][tata[nod]]-=sal;
nod=tata[nod];
}
}
g<<costfinal;
return 0;
}