Pagini recente » Cod sursa (job #1829254) | Cod sursa (job #1282422) | Cod sursa (job #2278998) | Cod sursa (job #2705882) | Cod sursa (job #437164)
Cod sursa(job #437164)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<bitset>
using namespace std;
const int MAXN = 128, inf = 2000000001;
vector<int> G[MAXN];
queue<int> q;
bool viz[MAXN];
int n, m, from[MAXN], C[MAXN][MAXN];
int findPath(){
bool ok = true;
vector<int> :: iterator it;
int dad, pathCap, cap;
memset(viz, 0, sizeof(viz)); memset(from, -1, sizeof(from));
while(!q.empty()) q.pop();
q.push(1);
viz[1] = true;
while(!q.empty() && ok){
for(it=G[q.front()].begin();ok&&it!=G[q.front()].end();++it){
if( C[q.front()][*it] > 0 && ! viz [ *it ] ){
q.push(*it);
viz[*it] = 1;
from[*it]=q.front();
if((*it) == n) ok = false;
}
}
q.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 ];
}
if( pathCap == inf ) return 0;
else return pathCap;
}
int maxflow(){
int d = 2, flow = 0;
while ( ( d = findPath () ) )
flow += d;
return flow;
}
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;
C[y][x] = 0;
}
f.close();
flow = maxflow();
ofstream g("maxflow.out");
g<<flow<<'\n';
g.close();
return 0;
}