Pagini recente » Cod sursa (job #2858820) | Cod sursa (job #827968) | Cod sursa (job #1118424) | Cod sursa (job #2876148) | Cod sursa (job #2885127)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
queue <int>qu;
int inf=1e8,n;
int fre[1005];
int par[1005];
int cap[1005][1005];
int flux[1005][1005];
vector<int>adj[1005];
int bfs ()
{
int curr,i,k;
qu.push(1);
while(qu.size())
{
curr=qu.front();
qu.pop();
for(i=0; i<adj[curr].size(); i++)
{
k=adj[curr][i];
if(cap[curr][k]!=flux[curr][k] && fre[k]==0)
{
qu.push(k);
fre[k]=1;
par[k]=curr;
}
}
}
if(fre[n]==1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int i,h,m,j,k,flow,totalflow=0,a,b,w,curr;
cin>>n>>m;
for(i=1; i<=m; i++)
{
cin>>a>>b>>w;
cap[a][b]=cap[a][b]+w;
if(cap[a][b]+cap[b][a]==w)
{
adj[a].push_back(b);
adj[b].push_back(a);
}
}
int pos;
pos=bfs();
while(pos==1)
{
for(i=0; i<adj[n].size(); i++)
{
k=adj[n][i];
par[n]=k;
if(fre[k]==1 && flux[k]!=cap[k])
{
curr=n;
flow=inf;
while(curr!=1)
{
flow=min(flow,cap[par[curr]][curr]-flux[par[curr]][curr]);
curr=par[curr];
}
if(flow!=0 && flow!=inf)
{
curr=n;
while(curr!=1)
{
flux[par[curr]][curr]=flux[par[curr]][curr]+flow;
flux[curr][par[curr]]=flux[curr][par[curr]]-flow;
curr=par[curr];
}
}
totalflow=totalflow+flow;
}
}
for(i=1; i<=n; i++)
{
fre[i]=0;
}
pos=bfs();
}
cout<<totalflow;
return 0;
}