Pagini recente » Cod sursa (job #2884776) | Cod sursa (job #793843) | Cod sursa (job #1535883) | Istoria paginii runda/dorinta | Cod sursa (job #2495473)
#include <bits/stdc++.h>
#define DIM 1010
#define INF 2000000000
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> L[DIM],edges[DIM];
deque <int> c;
int capacitate[DIM][DIM],dist[DIM],st[DIM];
int n,m,x,y,C,i,sursa,dest;
void bfs (int sursa, int dest){
for (int i=sursa;i<=dest;i++){
// edges[i].clear();
dist[i] = INF;
}
c.clear();
c.push_back(sursa);
dist[sursa] = 0;
while (!c.empty()){
int nod = c.front();
c.pop_front();
if (nod == dest)
break;
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (!capacitate[nod][vecin])
continue;
if (dist[vecin] == INF){
dist[vecin] = 1+dist[nod];
c.push_back(vecin);
}
//if (dist[vecin] == 1+dist[nod])
// edges[nod].push_back(vecin); /// level graph
}}}
int dfs (int nod, int dest, int max_flow){
if (nod == dest || !max_flow)
return max_flow;
int flow = 0;
for (;st[nod]<L[nod].size();st[nod]++){
int vecin = L[nod][st[nod]];
if (!capacitate[nod][vecin] || dist[vecin] != dist[nod]+1)
continue;
int val = dfs (vecin,dest,min(capacitate[nod][vecin],max_flow-flow));
flow += val;
capacitate[nod][vecin] -= val;
capacitate[vecin][nod] += val;
}
return flow;
}
int main (){
fin>>n>>m;
for (i=1;i<=m;i++){
fin>>x>>y>>C;
L[x].push_back(y);
L[y].push_back(x);
capacitate[x][y] = C;
}
sursa = 1, dest = n;
int sol = 0, flux;
do{
for (int i=sursa;i<=dest;i++)
st[i] = 0;
bfs (sursa, dest);
flux = dfs (sursa,dest,INF);
sol += flux;
} while (flux);
fout<<sol;
return 0;
}