Pagini recente » Cod sursa (job #1344700) | Cod sursa (job #628880) | Cod sursa (job #2469166) | Cod sursa (job #1928831) | Cod sursa (job #425626)
Cod sursa(job #425626)
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
#define pb push_back
#define mp make_pair
#define sc second
#define fs first
#define INF 0x3f3f
#define Nmax 355
vector<pair <short,short> > g[Nmax];
short c[Nmax][Nmax],f[Nmax][Nmax],dist[Nmax],t[Nmax];
bitset <Nmax> viz;
short n,m,s,d;
int cost;
struct cmp
{
bool operator () (const short &a , const short &b) const
{
return dist[a]>dist[b];
}
}; priority_queue <short,vector<short>,cmp> q;
bool dijkstra()
{
vector <pair <short,short> > :: iterator it;
short nod;
memset(dist,INF,sizeof(dist));
dist[s]=0;
for(q.push(s) ; !q.empty();)
{
nod = q.top();
viz[nod] = 0;
q.pop();
for(it=g[nod].begin() ; it!=g[nod].end ();++it)
if(dist[it->fs]>dist[nod]+it->sc && c[nod][it->fs]>f[nod][it->fs])
{
dist[it->fs]=dist[nod]+it->sc;
t[it->fs]=nod;
if(!viz[it->fs])
{
q.push(it->fs);
viz[it->fs]=1;
}
}
}
if(dist[d]==INF)
return 0;
return 1;
}
int main()
{
short i,x,y,z,w;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%hd%hd%hd%hd",&n,&m,&s,&d);
for(i=1;i<=m;++i)
{
scanf("%hd%hd%hd%hd",&x,&y,&z,&w);
c[x][y]=z;
g[x].pb (mp(y,w));
g[y].pb (mp(x,-w));
}
int nrmin;
for(nrmin=INF;dijkstra();nrmin=INF)
{
for(i=d;i!=s;i=t[i])
nrmin=min(nrmin,c[t[i]][i]-f[t[i]][i]);
for(i=d;i!=s;i=t[i])
{
f[t[i]][i]+=nrmin;
f[i][t[i]]-=nrmin;
}
cost+=nrmin*dist[d];
}
printf("%d",cost);
return 0;
}