Pagini recente » Mihnea Andreescu | Cod sursa (job #820714) | Cod sursa (job #2590947) | Cod sursa (job #1374414) | Cod sursa (job #2189724)
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <queue>
#include <algorithm>
#define pb push_back
#define mp make_pair
using namespace std;
const int nmax=355,INF=100000000;
int f[nmax][nmax],c[nmax][nmax],d[nmax][nmax],t[nmax],dist[nmax],vis[nmax],upd[nmax];
queue<int>q;
vector<int>adj[nmax];
int n,m,s,dest;
inline void citire()
{
scanf("%d%d%d%d",&n,&m,&s,&dest);
for(;m>0;--m)
{
int x,y,ct,z;
scanf("%d%d%d%d",&x,&y,&ct,&z);
adj[x].pb(y);
adj[y].pb(x);
c[x][y]+=ct;
d[x][y]+=z;
d[y][x]-=z;
}
for(int i=1;i<=n;i++) random_shuffle(adj[i].begin(),adj[i].end());
}
int bellman()
{
for(int i=1;i<=n;i++)
{
dist[i]=INF;
upd[i]=0;
vis[i]=0;
t[i]=0;
}
q.push(s);
vis[s]=1;
dist[s]=0;
while(!q.empty())
{
int nod=q.front();
q.pop();
vis[nod]=0;
for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
{
if(c[nod][*it]-f[nod][*it]<=0) continue;
if(dist[*it]>dist[nod]+d[nod][*it])
{
dist[*it]=dist[nod]+d[nod][*it];
t[*it]=nod;
if(!vis[*it])
{
vis[*it]=1;
q.push(*it);
}
}
}
}
if(dist[dest]==INF) return 0;
return 1;
}
inline void do_flow()
{
int flow=0,cost=0;
for(int fmin=INF;bellman();)
{
int sumt=0;
for(int nod=dest;nod!=s;nod=t[nod])
{
sumt+=d[t[nod]][nod];
fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
}
cost+=dist[dest]*fmin;
flow+=fmin;
for(int nod=dest;nod!=s;nod=t[nod])
{
f[t[nod]][nod]+=fmin;
f[nod][t[nod]]-=fmin;
}
}
printf("%d\n",cost);
}
int main()
{
freopen ("fmcm.in","r",stdin);
freopen ("fmcm.out","w",stdout);
citire();
do_flow();
}