Pagini recente » Cod sursa (job #2943981) | Cod sursa (job #3249585) | Cod sursa (job #2392910) | Cod sursa (job #318190) | Cod sursa (job #2239458)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 400
#define inf 1e9
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int n,m, start, stop;
int d[nmax], dist[nmax], viz[nmax], t[nmax], ans[nmax];
int cp[nmax][nmax], fx[nmax][nmax], ct[nmax][nmax];
vector <int> v[nmax];
queue <int> q;
priority_queue< pair <int,int> > pq;
void citire()
{
int i,j,k,c,z;
f>> n >> m >> start >> stop;
for(k=1; k<=m; k++)
{
f>>i>>j>>c>>z;
v[i].push_back(j);
v[j].push_back(i);
cp[i][j]=c;
ct[i][j]=z; ct[j][i]=-z;
}
}
void bellman()
{
int i, nod;
for(i=1; i<=n; i++)
d[i]=inf;
q.push(start);
d[start]=0;
while(!q.empty())
{
nod = q.front();
q.pop();
viz[nod]++;
if(viz[nod]==n)
return;
for(i=0; i<v[nod].size(); i++)
if(d[v[nod][i]]>d[nod]+ct[nod][v[nod][i]] && fx[nod][v[nod][i]]<=cp[nod][v[nod][i]])
{
d[v[nod][i]]=d[nod]+ct[nod][v[nod][i]];
q.push(v[nod][i]);
}
}
}
int dijkstra()
{
int i, nod;
while(!pq.empty()) pq.pop();
for(i=1; i<=n; i++)
dist[i]=inf;
pq.push({0,start});
viz[start]=1;
while(!pq.empty())
{
nod=pq.top().second;
pq.pop();
for(i=0; i<v[nod].size(); i++)
{ int newd=dist[nod]+ ct[nod][v[nod][i]] + d[nod] - d[v[nod][i]];
if(fx[nod][v[nod][i]]<=cp[nod][v[nod][i]] && newd<dist[v[nod][i]])
{
dist[v[nod][i]]=newd;
ans[v[nod][i]]=ans[nod] + ct[nod][v[nod][i]];
t[v[nod][i]]=nod;
pq.push({-dist[v[nod][i]], v[nod][i]});
}
}
}
for(i=1; i<=n; i++)
d[i]=ans[i];
return (dist[n]!=inf);
}
int main()
{
int fmin,i, cost;
citire();
bellman();
while(dijkstra())
{
fmin=inf;
for(i=stop; i!=start; i=t[i])
fmin=min(cp[t[i]][i]-fx[t[i]][i], fmin);
for(i=stop; i!=start; i=t[i])
{
fx[i][t[i]]+=fmin;
fx[t[i]][i]-=fmin;
}
cost= fmin*d[n];
}
g<<cost;
f.close();
g.close();
return 0;
}