Pagini recente » Cod sursa (job #2878387) | Cod sursa (job #1291077) | Cod sursa (job #3200054) | Cod sursa (job #2329188) | Cod sursa (job #2112628)
#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];
int c[nmax][nmax],f[nmax][nmax],t[nmax],viz[nmax],dist[nmax],cost[nmax][nmax];
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(c[nod][vec]-f[nod][vec]>0 && dist[vec]>dist[nod]+cost[nod][vec])
{
t[vec]=nod;
if(viz[vec]==0)
{
dist[vec]=dist[nod]+cost[nod][vec];
viz[vec]=1;
q.push(vec);
}
}
}
}
}
int main()
{
int rez=0,m,i,x,y,flux,s,d,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);
}
while(1)
{
memset(viz,0,sizeof(viz));
memset(t,0,sizeof(t));
for(i=1;i<=n;i++)
dist[i]=INF;
dist[s]=0;
BFS(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];
}
}
g<<rez;
return 0;
}