Pagini recente » Cod sursa (job #405721) | Cod sursa (job #481925) | Cod sursa (job #1930893) | Cod sursa (job #1748744) | Cod sursa (job #2088749)
#include <bits/stdc++.h>
#include<vector>
#define DN 355
#define pb push_back
#define x first
#define y second
#include<queue>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,s,d,dist[DN],f[DN][DN],rez,pr[DN],oldc[DN],r[DN];
int cap[DN][DN],cost[DN][DN],g,h,c,z;
vector<int>v[DN];
int inq[DN];
queue<int>q;
int old[DN];
priority_queue<pair<int,int> >H;
int nod,cs;
int dijkstra()
{
for(int i=1;i<=n;i++)
dist[i]=(1<<28);
dist[s]=0;
r[s]=0;
H.push({0,s});
while(!H.empty())
{
cs=-H.top().x;
nod=H.top().y;
H.pop();
if(cs!=dist[nod])
continue;
for(auto i:v[nod])
if(f[nod][i]<cap[nod][i])
{
int newd=dist[nod]+cost[nod][i]+old[nod]-old[i];
if(newd<dist[i])
{
dist[i]=newd;
pr[i]=nod;
H.push({-newd,i});
r[i]=r[nod]+cost[nod][i];
}
}
}
if(dist[d]==(1<<28))
return 0;
for(int i=1;i<=n;i++)
oldc[i]=dist[i];
nod=d;
int fmin=(1<<28);
while(nod!=s)
{
fmin=min(fmin,cap[pr[nod]][nod]-f[pr[nod]][nod]);
nod=pr[nod];
}
nod=d;
while(nod!=s)
{
f[pr[nod]][nod]+=fmin;
f[nod][pr[nod]]-=fmin;
nod=pr[nod];
}
rez+=fmin*r[d];
return 1;
}
void bf()
{
int nod;
q.push(s);
inq[s]=1;
for(int i=1;i<=n;i++)
old[i]=(1<<28);
old[s]=0;
while(!q.empty())
{
nod=q.front();
q.pop();
inq[nod]=0;
for(auto i:v[nod])
if(cap[nod][i]>f[nod][i]&&old[nod]+cost[nod][i]<old[i])
{
old[i]=old[nod]+cost[nod][i];
if(inq[i]==0)
{
inq[i]=1;
q.push(i);
}
}
}
}
int main()
{
fin>>n>>m>>s>>d;
for(int i=1;i<=m;i++)
{
fin>>g>>h>>c>>z;
cap[g][h]=c;
cost[g][h]=z;
cost[h][g]=-z;
v[g].pb(h);
v[h].pb(g);
}
bf();
for(int i=1;i<=n;i++)
dist[i]=(1<<28);
while(dijkstra())
{
}
fout<<rez;
}