Pagini recente » Cod sursa (job #117203) | Cod sursa (job #1167959) | Cod sursa (job #841317) | Cod sursa (job #1732223) | Cod sursa (job #3143054)
#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<int> con[355];
int capacity[355][355];
int prec[355];
int cost[355][355];
int prec_dist[355];
int dist[355];
int cor_dist[355];
void calc_init()
{
deque<int> dq;
for(int i=1;i<=n;i++)
prec_dist[i]=INF;
prec_dist[s]=0;
dq.push_back(s);
while(!dq.empty())
{
int nod = dq.front();
dq.pop_front();
for(auto adj:con[nod])
{
if(capacity[nod][adj]>0 && prec_dist[adj]>prec_dist[nod]+cost[nod][adj])
{
prec_dist[adj]=prec_dist[nod]+cost[nod][adj];
dq.push_back(adj);
}
}
}
}
void bfs()
{
priority_queue<pair<int,int>> pq;
for(int i=1;i<=n;i++)
dist[i]=INF,cor_dist[i]=INF;
dist[s]=0;
cor_dist[s]=0;
pq.push({0,s});
while(!pq.empty())
{
int nod = pq.top().second;
int cdist = -pq.top().first;
pq.pop();
if(cdist!=dist[nod])
continue;
for(auto adj:con[nod])
{
if(capacity[nod][adj]>0 && dist[adj]>dist[nod]+cost[nod][adj]+prec_dist[nod]-prec_dist[adj])
{
prec[adj]=nod;
dist[adj]=dist[nod]+cost[nod][adj]+prec_dist[nod]-prec_dist[adj];
cor_dist[adj]=cor_dist[nod]+cost[nod][adj];
pq.push({-dist[adj],adj});
}
}
}
for(int i=1;i<=n;i++)
prec_dist[i]=cor_dist[i];
}
pair<int,int> maxflow_mincost()
{
calc_init();
int flow=0,mincost=0;
while(1)
{
bfs();
if(cor_dist[d]==INF)
break;
int cur=d,cflow=INF;
while(cur!=s)
{
cflow=min(cflow,capacity[prec[cur]][cur]);
cur=prec[cur];
}
cur=d;
while(cur!=s)
{
capacity[prec[cur]][cur]-=cflow;
capacity[cur][prec[cur]]+=cflow;
cur=prec[cur];
}
flow+=cflow;
mincost+=cor_dist[d]*cflow;
}
return {flow,mincost};
}
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);
con[y].push_back(x);
cost[x][y]=z;
cost[y][x]=-z;
capacity[x][y]=c;
}
fout<<maxflow_mincost().second;
return 0;
}