Pagini recente » Borderou de evaluare (job #956575) | Clasament abcabc | Buline | Cod sursa (job #2179443) | Cod sursa (job #3143044)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int INF = 1e9;
int n,m,s,d;
vector<pair<int,int>> con[355];
int capacity[355][355];
int prec[355];
int dist[355];
pair<int,int> bfs()
{
for(int i=1;i<=n;i++)
{
dist[i]=INF;
prec[i]=0;
}
prec[s]=-1;
dist[s]=0;
priority_queue<pair<int,pair<int,int>>> pq;
pq.push({0,{INF,s}});
while(!pq.empty())
{
int cost = -pq.top().first;
int flow = pq.top().second.first;
int nod = pq.top().second.second;
pq.pop();
if(cost!=dist[nod])
continue;
if(nod==d)
return {flow,cost};
for(auto adj:con[nod])
{
if(dist[adj.first]>dist[nod]+adj.second && capacity[nod][adj.first]>0)
{
prec[adj.first]=nod;
dist[adj.first]=dist[nod]+adj.second;
pq.push({-dist[adj.first],{min(flow,capacity[nod][adj.first]),adj.first}});
}
}
}
return {0,0};
}
pair<int,int> maxflow_mincost()
{
int flow=0,cost=0;
while(1)
{
pair<int,int> x = bfs();
if(x.first==0)
break;
int cur=d;
while(cur!=s)
{
capacity[prec[cur]][cur]-=x.first;
capacity[cur][prec[cur]]+=x.first;
cur=prec[cur];
}
flow+=x.first;
cost+=x.second*x.first;
}
return {flow,cost};
}
signed main()
{
fin>>n>>m>>s>>d;
int x,y,c,z;
for(int i=0;i<m;i++)
{
fin>>x>>y>>c>>z;
con[x].push_back({y,z});
con[y].push_back({x,-z});
capacity[x][y]=c;
}
fout<<maxflow_mincost().second;
return 0;
}