Pagini recente » Cod sursa (job #1397482) | Istoria paginii runda/ath3 | Cod sursa (job #496697) | Cod sursa (job #53695) | Cod sursa (job #712765)
Cod sursa(job #712765)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
FILE *f = fopen("fmcm.in","r");
FILE *g = fopen("fmcm.out","w");
typedef vector<int>::iterator it;
#define MaxN 400
int N,M,S,d,CostMinim,flux[MaxN][MaxN],cost[MaxN][MaxN],D[MaxN],T[MaxN],inCoada[MaxN];
vector<int> A[MaxN];
void citire(void)
{
int a,b,z,c;
fscanf(f,"%d %d %d %d",&N,&M,&S,&d);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d %d",&a,&b,&z,&c);
A[a].push_back(b);
A[b].push_back(a);
flux[a][b] = z;
cost[a][b] = c;
cost[b][a] = -c;
}
}
inline void Stergere(void)
{
for(int i=1;i<=N;i++)
T[i] = D[i] = inCoada[i] = 0;
inCoada[S] = 1;
}
inline int min(int a,int b)
{
return a < b ? a : b;
}
inline int DF(void)
{
queue<int> Q;
Stergere();
for(Q.push(S);!Q.empty();inCoada[Q.front()] = 0,Q.pop())
for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
if(flux[Q.front()][*i] > 0)
if(!T[*i] || D[*i] > D[Q.front()] + cost[Q.front()][*i])
{
D[*i] = D[Q.front()]+cost[Q.front()][*i];
T[*i] = Q.front();
if(!inCoada[*i])
{
Q.push(*i);
inCoada[*i] = 1;
}
}
return T[d];
}
void Flux(void)
{
for(;DF();)
{
int Min = 1283712;
for(int i=d;i!=S;i=T[i])
Min = min(Min,flux[T[i]][i]);
for(int i=d;i!=S;i=T[i])
{
flux[T[i]][i] -= Min;
flux[i][T[i]] += Min;
}
CostMinim += Min*D[d];
}
}
int main()
{
citire();
Flux();
fprintf(g,"%d\n",CostMinim);
return 0;
}