Pagini recente » Cod sursa (job #1034256) | Cod sursa (job #2574642) | Cod sursa (job #1698487) | Cod sursa (job #956585) | Cod sursa (job #1233044)
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define N 355
#define oo 1000000000
using namespace std;
vector<int>v[N];
deque<int> Q;
priority_queue<pair<int,int> >q;
int n,m,s,d,CD,x,y,C[N][N],D[N][N],FL[N][N],c[N],tata[N],viz[N],i,X,sol;
void bellman()
{
Q.push_back(s);
for(i=1;i<=n;i++)
c[i]=oo;
c[s]=0;
while(Q.size())
{
X=Q.front();
for(vector<int>::iterator it=v[X].begin();it!=v[X].end();it++)
if(c[*it]>c[x]+D[x][*it])
{
c[*it]=c[x]+D[x][*it];
Q.push_back(*it);
}
Q.pop_front();
}
for(i=1;i<=n;i++)
for(vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
D[i][*it]+=c[i]-c[*it];
CD=c[d];
//fprintf(stderr,"%d",CD);
}
bool dijkstra()
{
int cnt;
q.push(make_pair(0,s));
for(i=1;i<=n;i++)
{
tata[i]=viz[i]=0;
c[i]=oo;
}
c[s]=0;cnt=n;
while(q.size())
{
X=q.top().second;q.pop();
if(viz[X])continue;
viz[X]=1;
for(vector<int>::iterator it=v[X].begin();it!=v[X].end();it++)
{
if(C[X][*it]-FL[X][*it]>0)
if(c[*it]>c[X]+D[X][*it])
{
c[*it]=c[X]+D[X][*it];
q.push(make_pair(-c[*it],*it));
tata[*it]=X;
}
}
}
return tata[d]?1:0;
}
void upd()
{
int x=tata[d],y=d,fl;
fl=C[x][y]-FL[x][y];
for(;y!=s;y=tata[y],x=tata[x])
fl=min(fl,C[x][y]-FL[x][y]);
for(x=tata[d],y=d;y!=s;y=tata[y],x=tata[x])
{
FL[x][y]+=fl;
FL[y][x]-=fl;
//sol+=fl*D[x][y];
}
sol+=((c[d]+CD)*fl);
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(;m;m--)
{
scanf("%d%d",&x,&y);
scanf("%d%d",&C[x][y],&D[x][y]);
v[x].push_back(y);
v[y].push_back(x);
D[y][x]=-D[x][y];
}
bellman();
// while(dijkstra())
// upd();
printf("%d\n",sol);
return 0;
}