Pagini recente » Cod sursa (job #516025) | Monitorul de evaluare | Cod sursa (job #247632) | Istoria paginii runda/iconcurs2/clasament | Cod sursa (job #2497940)
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=1005;
vector<int> gr[N];
int cap[N][N];
int flow[N][N];
int q[N*N];
int parent[N];
bool bfs(int n){
int st=0,dr=-1;
q[++dr]=1;
parent[1]=1;
memset(parent,0,(n+5)*sizeof(int));
while(st<=dr){
int nod=q[st++];
if(nod==n)
return true;
for(auto i:gr[nod]){
if(i!=nod && cap[nod][i]-flow[nod][i]>0 && parent[i]==0){
parent[i]=nod;
q[++dr]=i;
}
}
}
return false;
}
int drum(int n){
int tata=parent[n],nod=n,mini=1<<30;
while(nod != 1){
mini=min(mini,cap[tata][nod]-flow[tata][nod]);
nod=tata;
tata=parent[tata];
}
return mini;
}
void actualizeaza(int n,int flux){
int tata=parent[n],nod=n;
while(nod != 1){
flow[tata][nod]+=flux;
flow[nod][tata]-=flux;
nod=tata;
tata=parent[tata];
}
}
int main()
{
FILE*fin,*fout;
fin=fopen("maxflow.in","r");
fout=fopen("maxflow.out","w");
int n,m;
fscanf(fin,"%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,val;
fscanf(fin,"%d%d%d",&x,&y,&val);
gr[x].push_back(y);
gr[y].push_back(x);
cap[x][y]=val;
}
int rez=0;
while(bfs(n)){
for(int i=1;i<=n;i++){
if(cap[i][n]-flow[i][n]>0){
parent[n]=i;
int f=drum(n);
actualizeaza(n,f);
rez+=f;
}
}
}
fprintf(fout,"%d",rez);
return 0;
}