Pagini recente » Cod sursa (job #1061469) | Cod sursa (job #2401573) | Cod sursa (job #1628027) | Cod sursa (job #1251724) | Cod sursa (job #569435)
Cod sursa(job #569435)
#include<stdio.h>
#include<vector>
#include<queue>
#define MAX 351
#define INF 0x3f3f3f
using namespace std;
vector< pair<short int,short int> > G[MAX];
int N,M,S,D,cost;
short int C[MAX][MAX],F[MAX][MAX],in[MAX],T[MAX];
int d[MAX];
queue<short int> Q;
void read()
{
FILE*f = fopen("fmcm.in","r");
fscanf(f,"%d%d%d%d",&N,&M,&S,&D);
int i,x,y,c,z;
for(i=1;i<=M;++i)
{
fscanf(f,"%d%d%d%d",&x,&y,&c,&z);
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,-z));
C[x][y] = c;
}
fclose(f);
}
int BF(int S,int D)
{
memset(d,INF,sizeof(d));
memset(T,0,sizeof(T));
memset(in,0,sizeof(in));
d[S] = 0;
T[S] = S;
Q.push(S);
int nod;
vector< pair<short int,short int> >::iterator it;
while(Q.size())
{
nod = Q.front();
Q.pop();
in[nod] = 0;
if(nod == D)continue;
for(it = G[nod].begin();it!=G[nod].end();++it)
if(it->second + d[nod] < d[it->first] && C[nod][it->first] > F[nod][it->first])
{
T[it->first] = nod;
d[it->first] = it->second + d[nod];
if(!in[it->first])
{
in[it->first] = 1;
Q.push(it->first);
}
}
}
return T[D];
}
int main()
{
read();
int r,i;
while(BF(S,D))
{
i = D;
r = INF;
while(i!=S)
{
r = min(r,C[T[i]][i] - F[T[i]][i]);
i = T[i];
}
if(r==0)continue;
i = D;
while(i!=S)
{
F[T[i]][i] += r;
F[i][T[i]] -= r;
i = T[i];
}
cost+=r*d[D];
}
FILE*g = fopen("fmcm.out","w");
fprintf(g,"%d\n",cost);
fclose(g);
return 0;
}