Pagini recente » Cod sursa (job #3188095) | Cod sursa (job #5421) | Cod sursa (job #1191613) | Cod sursa (job #2905039) | Cod sursa (job #2872910)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
const int FIN=2000001;
int dist[500],heap[500],coord[500],nr;
void up(int k)
{
if(k==1)
return;
if(dist[heap[k]]<dist[heap[k/2]])
{
swap(coord[heap[k]],coord[heap[k/2]]);
swap(heap[k],heap[k/2]);
up(k/2);
}
}
void down(int k)
{
int p=k*2;
if(p>nr)
return;
if(p+1<=nr && dist[heap[p+1]]<dist[heap[p]])
p++;
if(dist[heap[k]]>dist[heap[p]])
{
swap(coord[heap[k]],coord[heap[p]]);
swap(heap[k],heap[p]);
down(p);
}
}
vector <int> v[500];
bool inheap[500];
int old[500],real[500],s,d,cap[500][500],cost[500][500],ante[500],n;
bool dijkstra()
{
for(int i=1;i<=n;i++)
dist[i]=FIN;
dist[s]=real[s]=0;
nr++;
heap[nr]=s;
inheap[s]=1;
while(nr)
{
int k=heap[1];
heap[1]=heap[nr];
inheap[k]=0;
nr--;
coord[heap[1]]=1;
down(1);
for(auto it=v[k].begin();it!=v[k].end();it++)
{
if(cap[k][*it]<=0)
continue;
int p=dist[k]+cost[k][*it]+old[k]-old[*it];
if(p<dist[*it])
{
dist[*it]=p;
real[*it]=real[k]+cost[k][*it];
ante[*it]=k;
if(inheap[*it]==0)
{
nr++;
inheap[*it]=1;
heap[nr]=*it;
coord[*it]=nr;
}
up(coord[*it]);
}
}
}
return dist[d]!=FIN;
}
bool inq[500];
queue <int> q;
bool bellman_ford()
{
for(int i=1;i<=n;i++)
old[i]=FIN;
old[s]=0;
q.push(s);
inq[s]=1;
while(q.empty()==false)
{
int k=q.front();
q.pop();
inq[k]=0;
for(auto it=v[k].begin();it!=v[k].end();it++)
{
if(cap[k][*it]<=0)
continue;
if(old[k]+cost[k][*it]>=old[*it])
continue;
old[*it]=old[k]+cost[k][*it];
if(inq[*it]==0)
{
q.push(*it);
inq[*it]=1;
}
}
}
return old[d]!=FIN;
}
int m,i,x,y,z,t,M,sol;
int main()
{
f>>n>>m>>s>>d;
for(i=1;i<=m;i++)
{
f>>x>>y>>z>>t;
v[x].push_back(y);
v[y].push_back(x);
cap[x][y]=z;
cost[x][y]=t;
cost[y][x]=-t;
}
if(bellman_ford()==0)
{
g<<-1;
return 0;
}
while(dijkstra()==1)
{
memcpy(old,real,sizeof(dist));
M=FIN;
for(i=d;i!=s;i=ante[i])
M=min(M,cap[ante[i]][i]);
sol=sol+M*real[d];
for(i=d;i!=s;i=ante[i])
{
cap[ante[i]][i]=cap[ante[i]][i]-M;
cap[i][ante[i]]=cap[i][ante[i]]+M;
}
}
g<<sol;
return 0;
}