Pagini recente » Cod sursa (job #888039) | Cod sursa (job #1484108)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define Nmax 355
#define pb push_back
using namespace std;
int n,m1,s,D,f,fcst;
int c[Nmax][Nmax],cst[Nmax][Nmax];
int inq[Nmax],old[Nmax],d[Nmax],reald[Nmax],p[Nmax];
queue<int> q;
vector<int> m[Nmax];
vector<int>::iterator it;
priority_queue< pair<int,int>,vector< pair<int,int> >,greater< pair<int,int> > > h;
void bellmanford()
{
memset(old , 0x3f , sizeof(old));
int loc;
old[s]=0;
inq[s]=1;
q.push(s);
for(;!q.empty();q.pop())
{
loc=q.front();
inq[loc]=0;
for(it=m[loc].begin();it<m[loc].end();it++)
if(c[loc][*it])
{
if(old[loc]+c[loc][*it]>=old[*it]) continue;
old[*it]=old[loc]+c[loc][*it];
if(inq[*it]) continue;
inq[*it]=1;
q.push(*it);
}
}
}
bool dijkstra()
{
memset(d,0x3f,sizeof(d));
reald[s]=0;
d[s]=0;
h.push(make_pair(d[s],s));
while(!h.empty())
{
int cost=h.top().first,nod=h.top().second;
h.pop();
if(d[nod]!=cost) continue;
for(it=m[nod].begin();it<m[nod].end();it++)
if(c[nod][*it])
{
int new_d = d[nod] + cst[nod][*it] + old[nod] - old[*it];
if (new_d < d[*it])
{
d[*it] = new_d;
reald[*it] = reald[nod] + cst[nod][*it];
p[*it] = nod;
h.push(make_pair(d[*it], *it));
}
}
}
memcpy(old, reald, sizeof(d));
if (d[D] == 0x3f3f3f3f)
return false;
int Min = 0x3f3f3f3f, curCst = 0;
for (int aux = D; aux != s; aux = p[aux])
Min = min(Min, c[p[aux]][aux]),
curCst += cst[p[aux]][aux];
f += Min;
fcst += Min * reald[D];
for (int aux = D; aux != s; aux = p[aux])
c[p[aux]][aux] -= Min,
c[aux][p[aux]] += Min;
return true;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m1,&s,&D);
int n1,n2;
for(;m1;m1--)
{
scanf("%d%d",&n1,&n2);
m[n1].pb(n2); m[n2].pb(n1);
scanf("%d%d",&c[n1][n2],&cst[n1][n2]);
cst[n2][n1]=-cst[n1][n2];
}
bellmanford();
while(dijkstra());
printf("%d\n",fcst);
fclose(stdin);
fclose(stdout);
return 0;
}