Pagini recente » Cod sursa (job #1290543) | Cod sursa (job #1134139) | Cod sursa (job #2962053) | Cod sursa (job #2085642) | Cod sursa (job #1409693)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define NMAX 355
#define INF 0x3f3f3f3f3f
using namespace std;
bool ap[NMAX];
int boss[NMAX],best[NMAX];
int n,m,x,y,z,c,surs,dest,costmax;
int cap[NMAX][NMAX],cost[NMAX][NMAX],flow[NMAX][NMAX];
queue <int >q;
vector <int>v[NMAX];
#define DIM 10000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
numar = 0;
char semn='+';
while (buff[poz] < '0' || buff[poz] > '9')
{
semn = buff[poz];
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
if (semn == '-')
numar = -numar;
}
inline bool bellman(int surs)
{
memset(ap,0,sizeof(ap));
for (int i=1;i<=n;i++)best[i]=INF,boss[i]=0;
ap[surs]=1;
q.push(surs);
best[surs]=0;
for (;!q.empty();q.pop())
{
int nod=q.front();
ap[nod]=0;
for (auto it:v[nod])
if (best[it]>best[nod]+cost[nod][it] && cap[nod][it]>0)
{
boss[it]=nod;
best[it]=best[nod]+cost[nod][it];
if (!ap[it])q.push(it);
}
}
return boss[dest]!=0;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
citeste(n);
citeste(m);
citeste(surs);
citeste(dest);
for (int i=1;i<=m;i++)
{
citeste(x);
citeste(y);
citeste(z);
citeste(c);
v[x].push_back(y);
v[y].push_back(x);
cost[x][y]=c;
cost[y][x]=-c;
cap[x][y]=z;
}
for (;bellman(surs);)
{
int maxflow=INF;
for (int nod=dest;boss[nod];nod=boss[nod])
maxflow=(maxflow>cap[boss[nod]][nod]?cap[boss[nod]][nod]:maxflow);
for (int nod=dest;boss[nod];nod=boss[nod])
{
cap[boss[nod]][nod]-=maxflow;
cap[nod][boss[nod]]+=maxflow;
flow[boss[nod]][nod]+=maxflow;
costmax+=cost[boss[nod]][nod]*maxflow;
}
//printf("%d\n",costmax);
}
printf("%d",costmax);
fclose(stdin);
fclose(stdout);
}