Pagini recente » Cod sursa (job #1861130) | Cod sursa (job #2448324) | Cod sursa (job #218521) | Cod sursa (job #2234863) | Cod sursa (job #2782330)
#include <bits/stdc++.h>
#define nmax 1001
using namespace std;
string prob="maxflow";
ifstream in(prob+".in");
ofstream out(prob+".out");
vector<int> vecini[nmax];
int adj[nmax][nmax];
int level[nmax];
int start[nmax];
int n,m;
bool levelG(){
int q[nmax];
int primulQ=0;
int ultimulQ=0;
memset(level,0,sizeof(level));
q[ultimulQ++]=1;
while(primulQ!=ultimulQ){
int nod=q[primulQ++];
if(nod==n)return 1;
for(auto i:vecini[nod]){
if(adj[nod][i]&&!level[i]&&i!=1){
level[i]=level[nod]+1;
q[ultimulQ++]=i;
}
}
}
return 0;
}
int pushF(int nod,int minn){
if(nod==n)return minn;
for(;start[nod]<vecini[nod].size();start[nod]++){
int i=vecini[nod][start[nod]];
if((level[nod]+1==level[i])&&adj[nod][i]){
int tmp=pushF(i,min(minn,adj[nod][i]));
if(tmp){
adj[nod][i]-=tmp;
adj[i][nod]+=tmp;
return tmp;
}
}
}
return 0;
}
int main(){
in>>n>>m;
int x,y,z;
while(m--){
in>>x>>y>>z;
vecini[x].push_back(y);
vecini[y].push_back(x);
adj[x][y]=z;
}
int sum=0;
while(levelG()){
memset(start,0,sizeof(start));
int t=1;
while(t){
t=pushF(1,INT_MAX);
sum+=t;
}
}
out<<sum;
}