Pagini recente » Istoria paginii runda/s/clasament | Cod sursa (job #1669541) | Cod sursa (job #800508) | Cod sursa (job #1628823) | Cod sursa (job #2444274)
#include <fstream>
#include <vector>
#include <deque>
#define DIM 1002
#define INF 2000000000
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> edges[DIM],L[DIM];
deque <int> c;
int n,m,x,y,z,i;
int cap[DIM][DIM],dist[DIM];
void bfs (int sursa, int dest){
for (int i=1;i<=n;i++){
edges[i].clear();
dist[i] = INF;
}
dist[sursa] = 0;
c.clear();
c.push_back(sursa);
while (!c.empty()){
int nod = c.front();
if (nod == dest)
break;
c.pop_front();
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (!cap[nod][vecin])
continue;
if (dist[vecin] == INF){
dist[vecin] = 1 + dist[nod];
c.push_back(vecin);
}
if (dist[nod]+1 == dist[vecin])
edges[nod].push_back(vecin); /// am un subgraf pe care o sa bag flux
}}}
int dfs (int nod, int dest, int maxflow){
/// dfs ul il fac pe graful de nivele.
if (maxflow == 0) /// nu mai are sens sa continui
return 0;
if (nod == dest)
return maxflow;
int flow = 0;
for (int i=0;i<edges[nod].size();i++){
int vecin = edges[nod][i];
if (!cap[nod][vecin])
continue;
int val = dfs (vecin,dest,min(cap[nod][vecin],maxflow-flow));
cap[nod][vecin] -= val;
cap[vecin][nod] += val;
flow += val;
}
return flow;
}
int main (){
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y>>z;
L[x].push_back(y);
L[y].push_back(x);
cap[x][y] = z;
}
int sursa = 1, dest = n, sol = 0, flux;
do{
bfs(sursa,dest);
flux = dfs (sursa,dest,INF);
sol += flux;
} while (flux);
fout<<sol;
return 0;
}