Pagini recente » Cod sursa (job #1900026) | Cod sursa (job #2328796) | Cod sursa (job #2538002) | Cod sursa (job #306959) | Cod sursa (job #437211)
Cod sursa(job #437211)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<bitset>
using namespace std;
const int MAXN = 1024, inf = 120000;
vector<int> G[MAXN];
queue<int> q, leaves;
bool viz[MAXN];
int n, m, from[MAXN], C[MAXN][MAXN];
int findPath(){
vector<int> :: iterator it;
int dad, pathCap, cap, flow = 0;
memset(viz, 0, sizeof(viz)); memset(from, -1, sizeof(from));
while(!q.empty()) q.pop();
while(!leaves.empty()) leaves.pop();
q.push(1);
viz[1] = true;
while(!q.empty()){
for(it=G[q.front()].begin();it!=G[q.front()].end();++it){
if( C[q.front()][*it] > 0 && ! viz [ *it ] ){
if(*it!=n) q.push(*it);
viz[*it] = true;
from[*it]=q.front();
if((*it) == n){ leaves.push(q.front());viz[n]=false;}
}
}
q.pop();
}
if ( leaves.empty() )
return 0;
while(!leaves.empty()){
from[n]=leaves.front();
leaves.pop();
dad=n; pathCap=inf;
while(from[dad]!=-1){
cap = C[from [ dad ]][ dad];
if(cap<pathCap)
pathCap=cap;
dad = from [ dad ];
}
dad = n;
while(from[dad]!=-1){
C[from[dad]][dad] -= pathCap;
C[dad][from[dad]] += pathCap;
dad = from [ dad ];
}
flow += pathCap;
}
return flow;
}
int maxflow(){
int d, flow=0;
while ( 1 ){
d = findPath ();
if( d == 0 ) return flow;
else flow = flow + d;
}
}
int main(){
int i, x, y, c, flow;
ifstream f("maxflow.in");
f>>n>>m;
for(i=0;i<m;i++){
f>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = c;
}
f.close();
flow = maxflow();
ofstream g("maxflow.out");
g<<flow<<'\n';
g.close();
return 0;
}