Pagini recente » Cod sursa (job #746040) | Cod sursa (job #1583387) | Cod sursa (job #2147918) | Cod sursa (job #503571) | Cod sursa (job #1170223)
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int Nmax = 1005;
vector<int> G[Nmax];
int C[Nmax][Nmax];
int pred[Nmax];
int N,M;
queue<int> q;
int bfs(){
memset(pred,0,sizeof(pred)); pred[1]=1;
q.push(1);
while(!q.empty()){
int x=q.front(); q.pop();
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
if(!pred[*it] && abs(C[x][*it])){
pred[*it]=x;
q.push(*it);
}
}
}
return pred[N]!=0;
}
int Maxflow(){
int MF=0;
while(bfs()){
for(vector<int>::iterator it=G[N].begin();it!=G[N].end();++it){
if(pred[*it]){
int x=*it;
int Min=C[x][N];
while(x!=1){
Min=min(Min, abs(C[pred[x]][x]) ),x=pred[x];
if(!Min) break;
}
if(Min){
MF+=Min;
x=*it;
C[x][N]-=Min;
C[N][x]+=Min;
while(x!=1){
C[pred[x]][x]-=Min;
C[x][pred[x]]+=Min;
x=pred[x];
}
}
}
}
}
return MF;
}
int main(){
in>>N>>M;
for(int i=1;i<=M;i++){
int x,y,z;
in>>x>>y>>z;
C[x][y]=z;
G[x].push_back(y);
G[y].push_back(x);
}
out<<Maxflow()<<'\n';
return 0;
}