Pagini recente » Cod sursa (job #1900222) | Cod sursa (job #2953090) | Cod sursa (job #2961043) | Cod sursa (job #605418) | Cod sursa (job #1511297)
#include<iostream>
#include<fstream>
#include<vector>
#define maxn 350
#include<cstring>
#define inf 2000000000
#define ll long long
#define maxx 1000010
#include<queue>
using namespace std;
long long dist[maxn],from[maxn],c[maxn][maxn],cost[maxn][maxn],f[maxn][maxn],u[maxn],n,s,t,drum,l,d,m;
vector<int> v[maxn];
queue<int> q;
long long BellmanFord()
{
long long i,j;
//mem
for(i=1;i<=n;i++)
{
dist[i]=inf;
from[i]=-1;
}
dist[s]=0;
while(!q.empty())
q.pop();
l=1;
q.push(s);
//q[l]=s;
memset(u,0,sizeof(u));
u[s]=1;
while(!q.empty())
{
long long k=q.front();
q.pop();
for(long long j=0;j<v[k].size();j++)
{
if(c[k][v[k][j]]-f[k][v[k][j]]>0 && dist[k] + cost[k][v[k][j]]<dist[v[k][j]])
{
dist[v[k][j]]= dist[k] + cost[k][v[k][j]];
from[v[k][j]]=k;
if(!u[v[k][j]])
{
l++;
q.push(v[k][j]);
u[v[k][j]]=1;
}
}
}
u[k]=0;
}
if(dist[d]!=inf)
{
long long 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()
{
long long 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;
}