Pagini recente » Rating Tucudean Adrian-Ionut (Tucudean) | Cod sursa (job #2085010) | Istoria paginii utilizator/lary_kiss007 | Monitorul de evaluare | Cod sursa (job #953418)
Cod sursa(job #953418)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#define pb push_back
#define mp make_pair
#define co first
#define no second
#define INF 999999999
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int i,n,costt,m,s,dest,x,y,z,tt,fluxm;
bool viz[355];
int cost[355][355],c[355][355];
int fl[355][355],t[355],d[355];
vector<int>l[355];
queue<int>q;
inline int bellman_ford()
{
memset(viz,0,sizeof(viz));
memset(t,0,sizeof(t));
memset(d,INF,sizeof(d));
q.push(s);
viz[s]=1;
d[s]=0;
while(!q.empty())
{
x=q.front();
q.pop();
viz[x]=0;
if(x==dest)
continue;
for(int i=0,dim=l[x].size();i<dim;++i)
{
y=l[x][i];
if(c[x][y]>fl[x][y]&&d[y]>d[x]+cost[x][y])
{
d[y]=d[x]+cost[x][y];
t[y]=x;
if(!viz[y])
{
q.push(y);
viz[y]=1;
}
}
}
}
return !t[dest];
}
int main()
{
f>>n>>m>>s>>dest;
for(i=1;i<=m;++i)
{
f>>x>>y>>z>>tt;
l[x].pb(y);
l[y].pb(x);
c[x][y]=z;
cost[x][y]=tt;
cost[y][x]=-tt;
}
while(1)
{
if(bellman_ford())
break;
fluxm=INF;
x=dest;
while(x!=s)
{
fluxm=min(fluxm,c[t[x]][x]-fl[t[x]][x]);
x=t[x];
}
if(!fluxm)
continue;
x=dest;
while(x!=s)
{
fl[t[x]][x]+=fluxm;
fl[x][t[x]]-=fluxm;
x=t[x];
}
costt+=fluxm*d[dest];
}
g<<costt<<'\n';
return 0;
}