Pagini recente » Cod sursa (job #117103) | Cod sursa (job #361048) | Cod sursa (job #2833302) | Cod sursa (job #1908947) | Cod sursa (job #2583524)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
const int N=1000;
int level[N+3],r[N+3][N+3],q[N+3],n;
vector <int> v[N+3];
bool bfs (int S, int D)
{
for(int i=1; i<=n; ++i)
level[i]=0;
int st=1,dr=0;
q[++dr]=S;
level[S]=1;
while(st<=dr)
{
int pz=q[st++];
for(int i=0; i<v[pz].size(); ++i)
if(!level[v[pz][i]] && r[pz][v[pz][i]]>0)
{
q[++dr]=v[pz][i];
level[v[pz][i]]=level[pz]+1;
}
}
return level[D];
}
int dfs (int pz, int D, int flow)
{
if(pz==D)
return flow;
for(int i=0; i<v[pz].size(); ++i)
{
if(level[v[pz][i]]==1+level[pz] && r[pz][v[pz][i]]>0)
{
int rzc=dfs(v[pz][i],D,min(flow,r[pz][v[pz][i]]));
if(rzc)
{
r[pz][v[pz][i]]-=rzc;
r[v[pz][i]][pz]+=rzc;
return rzc;
}
level[v[pz][i]]=0;
}
}
return 0;
}
int maxflow (int S, int D)
{
int rez=0;
while(bfs(S,D))
{
int cur;
while(cur=dfs(S,D,200003))
rez+=cur;
}
return rez;
}
void addedge (int a, int b, int c)
{
v[a].push_back(b);
v[b].push_back(a);
r[a][b]=c;
}
int main()
{
int i,j,m,k=0;
cin>>n>>m;
for(i=1; i<=m; ++i)
{
int a,b,c;
cin>>a>>b>>c;
addedge(a,b,c);
}
cout<<maxflow(1,n);
return 0;
}