Pagini recente » Cod sursa (job #796237) | Cod sursa (job #3233865) | Cod sursa (job #2540586) | Cod sursa (job #790511) | Cod sursa (job #3137522)
#include <bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
const int N = 360;
const int oo = 1000000000;
int n,m,S,D,flux,costFlux,cap[N][N],cst[N][N],oldCst[N],pozCst[N],realCst[N],T[N];
vector<int> v[N];
bitset<N> inQ;
queue<int> Q;
priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>>pq;
inline bool dijkstra()
{
fill(pozCst+1,pozCst+n+1,oo);
pozCst[S]=realCst[S]=0;T[S]=S;
pq.push(make_pair(0, S));
for (;pq.size();)
{
int pozCstNod,nod,pozCstVec;
tie(pozCstNod,nod)=pq.top();pq.pop();
if (pozCst[nod] != pozCstNod)
continue;
for (auto vec:v[nod])
if (cap[nod][vec]&&(pozCstVec=pozCstNod+cst[nod][vec]+oldCst[nod]-oldCst[vec])<pozCst[vec])
{
pozCst[vec]=pozCstVec;
realCst[vec]=realCst[nod]+cst[nod][vec];
T[vec]=nod;
pq.push(make_pair(pozCst[vec],vec));
}
}
memcpy(oldCst,realCst, sizeof(pozCst));
if (pozCst[D]==oo)return false;
int fluxDrum=oo,costDrum = 0;
for (int x=T[D],y=D;y!=S;x=T[x],y=T[y])fluxDrum=min(fluxDrum,cap[x][y]),costDrum+=cst[x][y];
flux+=fluxDrum;costFlux+=fluxDrum*realCst[D];
for (int x=T[D],y=D;y!= S;x=T[x],y=T[y])cap[x][y]-=fluxDrum,cap[y][x]+=fluxDrum;
return true;
}
inline bool bellmanFord()
{
fill(oldCst+1,oldCst+n+1,oo);oldCst[S] = 0;
for (Q.push(S), inQ[S] = 1;Q.size(); Q.pop())
{
int nod = Q.front();inQ[nod] = 0;
for (auto vec:v[nod])
if (cap[nod][vec])
if (oldCst[vec]<oldCst[nod]+cst[nod][vec])
{
oldCst[vec] = oldCst[nod] + cst[nod][vec];
if (!inQ[vec]){inQ[vec]=1;Q.push(vec);}
}
}
return oldCst[D]!=oo;
}
int main()
{
f>>n>>m>>S>>D;
for(;m;m--)
{
int x, y;
f>>x>>y;v[x].push_back(y);v[y].push_back(x);
f>>cap[x][y]>>cst[x][y];cst[y][x]=-cst[x][y];
}
flux=costFlux=0;
bellmanFord();
while(dijkstra());
g<<costFlux;
return 0;
}