Pagini recente » Cod sursa (job #391990) | Cod sursa (job #576530) | Cod sursa (job #301649) | Cod sursa (job #2626145) | Cod sursa (job #469511)
Cod sursa(job #469511)
#include <stdio.h>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
vector<int> graf[355];
vector<int>::iterator u;
int i,n,m,s,d,x,y,c,z,aux,first,difmin[355],cap[355][355],f[355][355],cost[355][355],tt[355];
long long dist[355],sol;
bool k;
struct cmp
{
inline bool operator()(const int &a,const int &b)const
{
return dist[a]>dist[b];
}
};
priority_queue<int,vector<int>,cmp> heap;
bitset<355> poz;
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d %d %d %d",&n,&m,&s,&d);
for (i=1;i<=m;++i)
{
scanf("%d %d %d %d",&x,&y,&c,&z);
graf[x].push_back(y);
cap[x][y]=c;
cost[x][y]=z;
graf[y].push_back(x);
cost[y][x]=-z;
}
k=true;
while (k)
{
k=false;
dist[1]=1LL*13000*10000000;
for (i=2;i<=n;++i)
dist[i]=dist[i-1];
poz&=0;
heap.push(s);
poz.flip(s);
dist[s]=0;
difmin[s]=2147000000;
while (!heap.empty())
{
first=heap.top();
if (first==d)
k=true;
poz.flip(first);
heap.pop();
for (u=graf[first].begin();u!=graf[first].end();++u)
if (cap[first][*u]>f[first][*u] && dist[first]+cost[first][*u]<dist[*u])
{
if (difmin[first]<cap[first][*u]-f[first][*u])
difmin[*u]=difmin[first];
else
difmin[*u]=cap[first][*u]-f[first][*u];
dist[*u]=dist[first]+cost[first][*u];
tt[*u]=first;
if (!poz.test(*u))
{
heap.push(*u);
poz.flip(*u);
}
}
}
if (k)
for (i=d;i!=s;i=tt[i])
{
f[tt[i]][i]+=difmin[d];
f[i][tt[i]]-=difmin[d];
sol+=difmin[d]*cost[tt[i]][i];
}
}
printf("%lld",sol);
return 0;
}