Pagini recente » Cod sursa (job #2805912) | Cod sursa (job #883488) | Cod sursa (job #969359) | Cod sursa (job #3122400) | Cod sursa (job #2189732)
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
#include <cstring>
#define pb push_back
using namespace std;
const int nmax=1055;
int dist[nmax][nmax],c[nmax][nmax],f[nmax][nmax],bmf[nmax],d2[nmax],q[1000+nmax],vis[nmax],t[nmax],reald[nmax];
vector<int>adj[nmax];
int n,m,s,d;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > >dj;
inline void citire()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=1;i<=m;i++)
{
int x,y,cr,z;
scanf("%d%d%d%d",&x,&y,&cr,&z);
adj[x].pb(y);
adj[y].pb(x);
dist[x][y]=z;
dist[y][x]=-z;
c[x][y]=cr;
}
}
inline void bellman()
{
for(int i=1;i<=n;i++) bmf[i]=100000000;
bmf[s]=0;
q[++q[0]]=s;
vis[s]=1;
for(int i=1;i<=q[0];i++)
{
int nod=q[i];
vis[nod]=0;
for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
{
if(!c[nod][*it]) continue;
if(bmf[*it]>bmf[nod]+dist[nod][*it])
{
bmf[*it]=bmf[nod]+dist[nod][*it];
if(vis[*it]) continue;
vis[*it]=1;
q[++q[0]]=*it;
}
}
}
}
int dijkstra()
{
for(int i=1;i<=n;i++)
{
d2[i]=0x3f3f3f3f;
t[i]=-1;
}
d2[s]=0;
dj.push(make_pair(0,s));
while(!dj.empty())
{
int nod=dj.top().second,drr=dj.top().first;
dj.pop();
if(nod==d||d2[nod]!=drr) continue;
for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
{
if(c[nod][*it]-f[nod][*it]<=0) continue;
if(d2[*it]>drr+dist[nod][*it]+bmf[nod]-bmf[*it])
{
d2[*it]=drr+dist[nod][*it]+bmf[nod]-bmf[*it];
dj.push(make_pair(d2[*it],*it));
t[*it]=nod;
reald[*it]=reald[nod]+dist[nod][*it];
}
}
}
memcpy(bmf,reald,sizeof(reald));
if(d2[d]==0x3f3f3f3f) return 0;
return 1;
}
int main()
{
freopen ("fmcm.in","r",stdin);
freopen ("fmcm.out","w",stdout);
citire();
bellman();
int maxflow=0,minc=0;
while(dijkstra())
{
int minim=0x3f3f3f3f;
for(int i=d;i!=s;i=t[i]) minim=min(minim,c[t[i]][i]-f[t[i]][i]);
maxflow+=minim;
minc+=minim*reald[d];
for(int i=d;i!=s;i=t[i])
{
f[t[i]][i]+=minim;
f[i][t[i]]-=minim;
}
}
printf("%d\n",minc);
}