Pagini recente » Cod sursa (job #363811) | Clasament 7312 | Cod sursa (job #434785) | Istoria paginii runda/cercel_e_gay_runda_2 | Cod sursa (job #1219250)
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define NMAX 352
#define INF 2000000000
int n,m,S,D,dist;
int f[NMAX][NMAX],cost[NMAX][NMAX],cap[NMAX][NMAX],t[NMAX],val[NMAX];
bool viz[NMAX];
vector<int>v[NMAX];
struct cmp
{
bool operator()(const int &a,const int &b)
{
return val[a]>val[b];
}
};
queue<int>qt;
priority_queue<int,vector<int>, cmp>q;
void bfs()
{
int nod,fiu;
for(int i=1;i<=n;++i)
val[i]=INF;
memset(viz,false,sizeof(viz));
viz[S]=true;
val[S]=0;
qt.push(S);
while(!qt.empty())
{
nod=qt.front();
qt.pop();
if(nod==D)
continue;
for(int i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if(f[nod][fiu]<cap[nod][fiu] && val[fiu]>val[nod]+cost[nod][fiu])
{
val[fiu]=val[nod]+cost[nod][fiu];
if(viz[fiu]==false)
{
viz[fiu]=true;
qt.push(fiu);
}
}
}
viz[nod]=false;
}
dist=val[D];
}
int drum()
{
int nod,fiu,minc=INF;
for(int i=1;i<=n;++i)
{
for(int j=0;j<v[i].size();++j)
{
if(val[i]!=INF && val[j]!=INF)
cost[i][j]+=val[i]-val[j];
//printf("%d ",cost[i][j]);
}
//printf("\n");
}
for(int i=1;i<=n;++i)
val[i]=INF;
val[S]=0;
t[S]=S;
viz[S]=true;
q.push(S);
while(!q.empty())
{
nod=q.top();
q.pop();
for(int i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if(f[nod][fiu]<cap[nod][fiu] && val[nod]+cost[nod][fiu]<val[fiu])
{
val[fiu]=val[nod]+cost[nod][fiu];
t[fiu]=nod;
if(viz[fiu]==false)
{
viz[fiu]=true;
q.push(fiu);
}
}
}
viz[nod]=false;
}
if(val[D]!=INF)
{
for(int i=D;i!=S;i=t[i])
if(cap[t[i]][i]-f[i][t[i]]<minc)
minc=cap[t[i]][i]-f[i][t[i]];
for(int i=D;i!=S;i=t[i])
{
f[t[i]][i]+=minc;
f[i][t[i]]-=minc;
}
dist+=val[D];
return dist*minc;
}
return INF;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
int i,j,x,y,c,z,d,sol=0;
scanf("%d%d%d%d",&n,&m,&S,&D);
for(i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
v[x].push_back(y);
v[y].push_back(x);
cost[x][y]=z;
cost[y][x]=-z;
cap[x][y]=c;
}
bfs();
while(true)
{
d=drum();
if(d==INF)
break;
sol+=d;
}
printf("%d\n",sol);
return 0;
}