Pagini recente » Cod sursa (job #2132839) | Cod sursa (job #1761734) | Cod sursa (job #1920258) | Cod sursa (job #1494872) | Cod sursa (job #2960394)
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
#include<cstring>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int NMAX = 351;
const int INF = 1e9;
int cap[NMAX][NMAX],flow[NMAX][NMAX],cost[NMAX][NMAX];
bool finished;
vector<int> vecini[NMAX];
int t[NMAX],n;
bitset<NMAX> inq;
long long ans;
void bf(int s,int d)
{
finished = 1;
vector<int> dp(NMAX,INF);
dp[s] = 0; queue<int> q;
q.push(s);
inq.reset(); inq[s] = 1;
memset(t,0,sizeof(t));
while(!q.empty())
{
int v = q.front(); q.pop();
inq[v] = 0;
for(auto it : vecini[v])
{
if((cap[v][it] - flow[v][it]) <= 0)
continue;
if((dp[v] + cost[v][it]) < dp[it])
{
t[it] = v;
dp[it] = dp[v] + cost[v][it];
if(!inq[it])
{
q.push(it);
inq[it] = 1;
}
}
}
}
if(dp[d] == INF)
return ;
finished = 0;
int r = INF;
for(int nod = d; nod != s; nod = t[nod])
r = min(r,cap[t[nod]][nod] - flow[t[nod]][nod]);
for(int nod = d; nod != s; nod = t[nod])
{
flow[t[nod]][nod] += r;
flow[nod][t[nod]] -= r;
}
ans += 1LL * r * dp[d];
}
void wannabe(int s,int d)
{
///vreau un drum de cost minim folosind doar muchii de augmentare
bf(s,d);
while(!finished)
{
bf(s,d);
}
fout << ans;
exit(0);
}
int main()
{
int a,b,s,d,c,m,z; fin >> n >> m >> s >> d;
for(int i = 1; i <= m ; i++)
{
fin >> a >> b >> c >> z;
vecini[a].emplace_back(b);
cap[a][b] = c;
cost[a][b] = z;
cost[b][a] = -z;
}
wannabe(s,d);
}