Pagini recente » Cod sursa (job #2836058) | Cod sursa (job #672992) | Cod sursa (job #2467769) | Cod sursa (job #2019786) | Cod sursa (job #2112737)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define nmax 500
#define INF 1000000000
using namespace std;
ifstream fi("fmcm.in");
ofstream g("fmcm.out");
queue <int> q;
queue <int> vn;
vector <int> v[nmax];
struct data{
int cost,nod;
bool friend operator<(data a,data b)
{
return a.cost<b.cost;
}
};
priority_queue <data> h;
int c[nmax][nmax],f[nmax][nmax],t[nmax],viz[nmax],distv[nmax],cost[nmax][nmax],dist[nmax],d;
void BFS(int i)
{
int nod,vec;
t[i]=-1;
viz[i]=1;
q.push(i);
while(!q.empty())
{
nod=q.front();
q.pop();
viz[nod]=0;
for(i=0;i<v[nod].size();i++)
{
vec=v[nod][i];
if(distv[vec]>distv[nod]+cost[nod][vec] && c[nod][vec]-f[nod][vec]>0)
{
t[vec]=nod;
if(viz[vec]==0)
{
distv[vec]=distv[nod]+cost[nod][vec];
viz[vec]=1;
q.push(vec);
}
}
}
}
}
void dijkstra(int i)
{
data z,aux;
int nod,vec,noudist;
z.cost=0;
z.nod=i;
h.push(z);
while(!h.empty())
{
z=h.top();
h.pop();
if(z.nod==d)
return;
while(viz[z.nod]!=0 && !h.empty())
{
z=h.top();
h.pop();
}
if(viz[z.nod]==0)
{
viz[z.nod]=1;
nod=z.nod;
for(i=0;i<v[nod].size();i++)
{
vec=v[nod][i];
noudist=dist[nod]+cost[nod][vec]+distv[nod]-distv[vec];//noua distanta
if(dist[vec]>noudist && c[nod][vec]-f[nod][vec]>0)
{
t[vec]=nod;
dist[vec]=noudist;
aux.cost=dist[vec];
aux.nod=vec;
h.push(aux);
}
}
}
}
}
int main()
{
int rez=0,m,i,x,y,flux,s,n,cos;
fi>>n>>m>>s>>d;
for(i=1;i<=m;i++)
{
fi>>x>>y>>flux>>cos;
c[x][y]+=flux;
cost[x][y]=cos;
cost[y][x]=-cos;
v[x].push_back(y);
v[y].push_back(x);
}
for(i=1;i<=n;i++)
distv[i]=INF;
distv[s]=0;
BFS(s);
while(1)
{
memset(viz,0,sizeof(viz));
memset(t,0,sizeof(t));
for(i=1;i<=n;i++)
dist[i]=INF;
dist[s]=0;
dijkstra(s);
if(t[d]==0)
break;
flux=INF;
x=d;
while(x!=s)
{
flux=min(flux,c[t[x]][x]-f[t[x]][x]);
x=t[x];
}
x=d;
while(x!=s)
{
f[t[x]][x]+=flux;
f[x][t[x]]-=flux;
rez+=cost[t[x]][x]*flux;
x=t[x];
}
for(i=1;i<=n;i++)
distv[i]=dist[i];
}
g<<rez;
return 0;
}