Pagini recente » Cod sursa (job #738810) | Cod sursa (job #2741908) | Cod sursa (job #2705360) | Cod sursa (job #206143) | Cod sursa (job #2396915)
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,inc,sf,x,y,cap,val;
int ans;
vector<int>nod[355];
int c[355][355],cst[355][355];
int mn_cst[355];
int aux[355];
int dist[355];
int father[355];
bool inq[355];
priority_queue<pii,vector<pii>,greater<pii> >pq;
bool dijkstra()
{
for(int i=1;i<=n;i++)
dist[i]=INT_MAX;
dist[inc]=0;
aux[inc]=0;
pq.push({dist[inc],inc});
while(!pq.empty())
{
int d=pq.top().first;
int pos=pq.top().second;
pq.pop();
if(dist[pos]<d)continue;
for(int i=0;i<nod[pos].size();i++)
{
if(c[pos][nod[pos][i]]==0)continue;
if(dist[nod[pos][i]]<=d+cst[pos][nod[pos][i]]+mn_cst[pos]-mn_cst[nod[pos][i]])continue;
dist[nod[pos][i]]=d+cst[pos][nod[pos][i]]+mn_cst[pos]-mn_cst[nod[pos][i]];
aux[nod[pos][i]]=aux[pos]+cst[pos][nod[pos][i]];
father[nod[pos][i]]=pos;
pq.push({dist[nod[pos][i]],nod[pos][i]});
}
}
memcpy(mn_cst,aux,sizeof(dist));
if(dist[sf]==INT_MAX)
return false;
int mn=INT_MAX;
int cur_cst=0;
for(int i=sf;i!=inc;i=father[i])
mn=min(mn,c[father[i]][i]);
ans+=mn*aux[sf];
for(int i=sf;i!=inc;i=father[i])
{
c[father[i]][i]-=mn;
c[i][father[i]]+=mn;
}
return true;
}
void ford()
{
for(int i=1;i<=n;i++)
mn_cst[i]=INT_MAX;
mn_cst[inc]=0;
queue<int>q;
q.push(inc);
while(!q.empty())
{
int pos=q.front();
q.pop();
inq[pos]=false;
for(int i=0;i<nod[pos].size();i++)
if(c[pos][nod[pos][i]])
{
if(mn_cst[nod[pos][i]]<=mn_cst[pos]+cst[pos][nod[pos][i]])continue;
mn_cst[nod[pos][i]]=mn_cst[pos]+cst[pos][nod[pos][i]];
if(inq[nod[pos][i]])continue;
inq[nod[pos][i]]=true;
q.push(nod[pos][i]);
}
}
}
int main()
{
fin>>n>>m>>inc>>sf;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>cap>>val;
nod[x].push_back(y);
nod[y].push_back(x);
c[x][y]=cap;
cst[x][y]=val;
cst[y][x]=-val;
}
ford();
while(dijkstra());
fout<<ans;
return 0;
}