Pagini recente » Cod sursa (job #2317782) | Cod sursa (job #2740662) | Cod sursa (job #3260081) | Cod sursa (job #901315) | Cod sursa (job #408773)
Cod sursa(job #408773)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define Nmax 355
#define inf 0x3f3f3f3f
#define fst first
#define snd second
int N,M,S,D,F[Nmax][Nmax];
vector < pair<int,int> > l[Nmax];
int d[Nmax],v[Nmax],p[Nmax];
struct cmp
{
bool operator()(int a,int b)
{
return (d[a] > d[b]);
}
};
priority_queue <int, vector<int> ,cmp> Heap;
void init()
{
for(int i=1;i<=N;++i)
{
d[i]=inf;
p[i]=0;
v[i]=0;
}
for(; !Heap.empty() ; Heap.pop() );
}
int dijkstra()
{
init();
d[S]=0;
Heap.push(S);
v[S]=1;
int nod;
for(; !Heap.empty() ;)
{
nod=Heap.top();
v[nod]=0;
Heap.pop();
for(int i=0;i<(int)l[nod].size() ;++i)
if (d[ l[nod][i].fst ] > d[nod] + l[nod][i].snd && F[nod][l[nod][i].fst])
{
d[ l[nod][i].fst ] = d[nod] + l[nod][i].snd;
p[ l[nod][i].fst ] = nod;
if (!v[ l[nod][i].fst ])
{
v[ l[nod][i].fst ]=1;
Heap.push(l[nod][i].fst);
}
}
}
if (d[D]==inf)
return 0;
return 1;
}
void solve()
{
int min,Cost=0;
for( ; dijkstra() ; )
{
min=inf;
for(int t=D; t!=S ;t=p[t])
if (min > F[p[t]][t])
min = F[p[t]][t];
for(int t=D; t!=S ;t=p[t])
{
F[p[t]][t] -= min;
F[t][p[t]] += min;
}
Cost += min*d[D];
}
printf("%d\n",Cost);
}
void cit();
int main()
{
cit();
solve();
return 0;
}
void cit()
{
int x,y,z,t;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d %d %d %d",&N,&M,&S,&D);
for(int i=1;i<=M;++i)
{
scanf("%d%d%d%d",&x,&y,&z,&t);
F[x][y]=z;
l[x].push_back( make_pair(y,t) );
l[y].push_back( make_pair(x,-t) );
}
}