Pagini recente » Cod sursa (job #256057) | Cod sursa (job #1049178) | Cod sursa (job #828432) | Cod sursa (job #1811158) | Cod sursa (job #431652)
Cod sursa(job #431652)
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#define IN "fmcm.in"
#define OUT "fmcm.out"
#define Lg 355
#define oo 0x3f3f3f3f
using namespace std;
int Fl[Lg][Lg];
int Cost[Lg][Lg];
vector <int > V[Lg];
int grad[Lg];
int T[Lg] , viz[Lg];
int Dist[Lg];
int D, S, n, m, Flux;
struct cmp
{
bool operator()(const int &a,const int &b)const
{
return Dist[a]>Dist[b];
}
};
priority_queue<int, vector<int>, cmp> Q;
void citire()
{
int a,b,c,d;
scanf ("%d %d %d %d",&n, &m, &S, &D);
for (int i=0;i<m ;i++)
{
scanf ("%d %d %d %d",&a,&b,&c,&d);
V[a].push_back(b);
V[b].push_back(a);
grad[a]++;
grad[b]++;
Cost[a][b]=d;
Cost[b][a]=-d;
Fl[a][b]=c;
}
}
int dijkstra()
{
int top;
for (int i=0;i<=n;i++)
{
viz[i]=0;
T[i]=0;
Dist[i]=oo;
}
while (!Q.empty())
Q.pop();
Dist[S]=0;
Q.push(S);
while (!Q.empty())
{
top=Q.top();
Q.pop();
viz[top]=0;
for (int i=0;i<grad[top];i++)
{
if (Dist[top] + Cost[top][V[top][i]]< Dist[V[top][i]])
if (Fl[top][V[top][i]])
{
Dist[V[top][i]] = Dist[top] + Cost[top][V[top][i]];
T[V[top][i]] = top;
if (!viz[V[top][i]])
{
viz[V[top][i]]=1;
Q.push(V[top][i]);
}
}
}
}
if (Dist[D]!=oo)
return 1;
return 0;
}
void solve()
{
int nod,fl;
while(dijkstra())
{
nod = D;
fl = oo;
while (nod!=S)
{
fl=min(fl,Fl[T[nod]][nod]);
nod=T[nod];
}
nod=D;
while (nod!=S)
{
Fl[T[nod]][nod]-=fl;
Fl[nod][T[nod]]+=fl;
nod=T[nod];
}
Flux+=fl*Dist[D];
}
printf("%d\n",Flux);
}
int main ()
{
freopen (IN ,"r", stdin);
freopen (OUT ,"w", stdout);
citire();
solve();
return 0;
}