Pagini recente » Cod sursa (job #1607906) | Cod sursa (job #191806) | Cod sursa (job #1999444) | Cod sursa (job #741646) | Cod sursa (job #891176)
Cod sursa(job #891176)
#include <fstream>
#include <vector>
#include <queue>
int main() {
std::ifstream in("fmcm.in");
std::ofstream out("fmcm.out");
int N,M,S,D;
in>>N>>M>>S>>D;
--S; --D;
std::vector < std::vector< std::pair<int,int> > > G( N , std::vector< std::pair<int,int> > (N) );
std::vector< std::vector<int> > Gr(N,std::vector<int>());
while(M--) {
int x,y,u,c;
in>>x>>y>>u>>c;
--x; --y;
Gr[x].push_back(y);
Gr[y].push_back(x);
G[x][y] = std::make_pair(u,c);
G[y][x] = std::make_pair(0,-c);
}
int cost = 0;
while(true) {
{
std::vector<int> pi(N,0x7FFFFFFF), fat(N,0x7FFFFFFF);
std::vector<bool> inQ(N,false);
std::queue<int> Q;
pi[S] = 0; fat[S] = S; Q.push(S); inQ[S] = true;
while(!Q.empty()) {
int i = Q.front(); Q.pop(); inQ[i] = false;
for(unsigned j=0;j<Gr[i].size();++j) {
if(G[i][Gr[i][j]].first > 0 && pi[i] != 0x7FFFFFFF && pi[i] + G[i][Gr[i][j]].second < pi[Gr[i][j]]) {
fat[Gr[i][j]] = i;
pi[Gr[i][j]] = pi[i] + G[i][Gr[i][j]].second;
if(!inQ[Gr[i][j]])
inQ[Gr[i][j]] = true, Q.push(Gr[i][j]);
}
}
}
if(pi[D] != 0x7FFFFFFF) {
int min = 0x7FFFFFFF;
for(int t = D; fat[t] != t; t = fat[t]) {
min = std::min(min,G[fat[t]][t].first);
}
for(int t = D; fat[t] != t; t = fat[t]) {
G[fat[t]][t].first -= min;
G[t][fat[t]].first += min;
}
cost += min * pi[D];
}
else break;
}
}
out<<cost;
return 0;
}