Pagini recente » Cod sursa (job #2012187) | Monitorul de evaluare | Cod sursa (job #656687) | Cod sursa (job #807789) | Cod sursa (job #1511263)
#include<iostream>
#include<fstream>
#include<vector>
#define maxn 510
#include<cstring>
#define inf 2000000000
#define ll long long
#define maxx 1000010
using namespace std;
int dist[maxn],from[maxn],c[maxn][maxn],cost[maxn][maxn],f[maxn][maxn],q[maxx],u[maxn],n,s,t,drum,l,d,m;
vector<int> v[maxn];
int BellmanFord()
{
int i,j;
for(i=1;i<=n;i++)
{
dist[i]=inf;
from[i]=-1;
}
dist[s]=0;
l=1;
q[l]=s;
memset(u,0,sizeof(u));
u[s]=1;
for(i=1;i<=l;i++)
{
for(int j=0;j<v[q[i]].size();j++)
{
if(c[q[i]][v[q[i]][j]]-f[q[i]][v[q[i]][j]]>0 && dist[q[i]] + cost[q[i]][v[q[i]][j]]<dist[v[q[i]][j]])
{
dist[v[q[i]][j]]= dist[q[i]] + cost[q[i]][v[q[i]][j]];
from[v[q[i]][j]]=q[i];
if(!u[v[q[i]][j]])
{
l++;
q[l]=v[q[i]][j];
u[q[l]]=1;
}
}
}
u[q[i]]=0;
}
if(dist[d]!=inf)
{
int vmin = inf;
drum = 1;
for (i = d; i != s; i = from[i]) vmin = min(vmin, c[from[i]][i] - f[from[i]][i]);
for (i = d; i != s; i = from[i])
{
f[from[i]][i] += vmin;
f[i][from[i]] -= vmin;
}
return vmin * dist[d];
}
return 0;
}
long long flux()
{
long long rez=0;
drum=1;
while(drum)
{
drum=0;
rez+=BellmanFord();
// cout<<rez<<" ";
}
return rez;
}
int main()
{
int i,x,t,cap,z,y;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
cin>>n>>m>>s>>d;
for(i=1;i<=m;i++)
{
cin>>x>>y>>cap>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=cap;
cost[x][y]=z;
cost[y][x]=-z;
}
cout<<flux()<<" ";
return 0;
}