Pagini recente » Cod sursa (job #2703850) | Cod sursa (job #2858776) | Cod sursa (job #2180034) | Cod sursa (job #2515530) | Cod sursa (job #2902946)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int INF=0x3F3F3F3F;
typedef pair<unsigned,int> PUI;
typedef pair<unsigned,unsigned> PUU;
vector<unsigned> Adj[351];
unsigned F[351][351];
int Cst[351][351];
int Dist[351];
int ndist[351];
unsigned tati[351];
int real_d[351];
priority_queue<PUU,vector<PUU>,greater<PUU> > pq;
bool enqueued[351];
void BellmanFord(const unsigned n, const unsigned s)
{
queue<unsigned> q;
q.push(s);
while(!q.empty())
{
unsigned f=q.front(); q.pop(); enqueued[f]=false;
for(auto it=Adj[f].begin();it!=Adj[f].end();++it)
if(Dist[*it]>Dist[f]+Cst[f][*it]&&F[f][*it]!=0)
{
Dist[*it]=Dist[f]+Cst[f][*it];
if(!enqueued[*it])
q.push(*it);
}
}
}
bool ameliorare_Dijkstra(int &cstmin, const unsigned &n, const unsigned &s, const unsigned &d)
{
memset(ndist,0x3F,4*(n+1));
memset(real_d,0x3F,4*(n+1));
pq.push(PUU(0,s));
ndist[s]=0; real_d[s]=0;
while(!pq.empty())
{
int cdist=pq.top().first; unsigned cnod=pq.top().second;
pq.pop();
if(cdist==ndist[cnod])
for(auto it=Adj[cnod].begin();it!=Adj[cnod].end();++it)
{
int temp;
if( (F[cnod][*it]>0) && (ndist[*it] > (temp=cdist+Dist[cnod]-Dist[*it]+Cst[cnod][*it])) )
{
ndist[*it]=temp;
pq.push(PUU(temp,*it));
tati[*it]=cnod;
real_d[*it]=real_d[cnod]+Cst[cnod][*it];
}
}
}
if(ndist[d]!=INF)//am gasit drum de ameliorare
{
unsigned cflux=INF;
for(unsigned i=d;i!=s;i=tati[i])
if(F[tati[i]][i]<cflux)
cflux=F[tati[i]][i];
for(unsigned i=d;i!=s;i=tati[i])
{
F[tati[i]][i]-=cflux;
F[i][tati[i]]+=cflux;
}
cstmin+=cflux*real_d[d];
memcpy(Dist,real_d,4*(n+1));
return true;
}
return false;
}
int main()
{
unsigned n, m, s, d;
fin >> n >> m >> s >> d;
memset(Dist,0x3F,4*(n+1));
for(unsigned i=0;i<m;++i)
{
unsigned x, y, c;
int z;
fin >> x >> y >> c >> z;
Adj[x].push_back(y);
Adj[y].push_back(x);
F[x][y]=c;
Cst[x][y]=z;
Cst[y][x]=-z;
}
Dist[s]=0;
BellmanFord(n, s);
int cstmin = 0;
while(ameliorare_Dijkstra(cstmin, n, s, d))
;
fout << cstmin;
}