Pagini recente » Cod sursa (job #2765459) | Cod sursa (job #1724644) | Cod sursa (job #1523752) | Cod sursa (job #942318) | Cod sursa (job #2135703)
#include <iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define N 400
#define inf 9999999
#define pb push_back
#define s second
#define f first
#define mp make_pair
int viz[N],t[N],n,S,D,m,i,j,x,y,z,F[N][N],C[N][N],d[N],fm,cst[N][N],ans,c;
///F[i][j] fluxul de pe muchia i j
///C[i][j] capacitatea de pe muchia i j
///cst[i][j] costul de pe muchia i j
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >h;
vector<int>a[N];
bool dijkstra()
{
memset(t,0,sizeof(t));
memset(viz,0,sizeof(viz));
memset(d,inf,sizeof(d));
t[S]=-1;
d[S]=0;
viz[S]=1;
h.push(mp(0,S));
while(!h.empty())
{
x=h.top().s;c=h.top().f;
h.pop();
if(c!=d[x]||x==D)continue;
for(i=0;i<a[x].size();++i)
{
y=a[x][i];
if(C[x][y]>F[x][y] && d[x]+cst[x][y]<d[y])
{
d[y]=d[x]+cst[x][y];
t[y]=x;
if(!viz[y])
{
h.push(mp(d[y],y));
viz[y]=1;
}
}
}
}
return viz[D];
}
int main()
{
ifstream f("fmcm.in");
f>>n>>m>>S>>D;
for(i=0;i<m;++i)
{
f>>x>>y>>c>>z;
a[x].pb(y);
a[y].pb(x);
cst[x][y]=z;
cst[y][x]=-z;
C[x][y]=c;
}
while(dijkstra())
{
fm=inf;
for(j=D;j!=S;j=t[j])
fm=min(fm,C[t[j]][j]-F[t[j]][j]);
if(!fm)continue;
for(j=D;j!=S;j=t[j])
{
F[t[j]][j]+=fm;
F[j][t[j]]-=fm;
ans+=fm*cst[t[j]][j];
}
}
ofstream g("fmcm.out");
g<<ans;
return 0;
}