Pagini recente » Cod sursa (job #1195411) | Cod sursa (job #2356047) | Cod sursa (job #986131) | Cod sursa (job #2786810) | Cod sursa (job #3038379)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int nmax=503;
int n,m;
vector<int> adj[nmax];
int start, fin;
map<pair<int,int>,int> cap;
bool vis[nmax];
int ret[nmax];
bool fluxBfs()
{
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod=q.front();
q.pop();
//cout<<"here "<<nod<<'\n';
if(nod==fin) continue;
for(auto e:adj[nod]) if(!vis[e]&&cap[{nod,e}]>0)
{
vis[e]=1;
ret[e]=nod;
q.push(e);
}
}
return vis[fin];
}
int augmentPath(int nod)
{
if(nod==start) return 0;
int flux=cap[{ret[nod],nod}];
int cur=ret[nod];
while(cur!=start)
{
flux=min(flux,cap[{ret[cur],cur}]);
cur=ret[cur];
}
cur=nod;
while(cur!=start)
{
cap[{ret[cur],cur}]-=flux;
cap[{cur,ret[cur]}]+=flux;
cur=ret[cur];
}
return flux;
}
int main()
{
f>>n>>m;
start=1,fin=n;
int a,b,c;
for(int i=0;i<m;i++)
{
f>>a>>b>>c;
if(cap[{b,a}]==0)
{
adj[a].push_back(b);
adj[b].push_back(a);
}
cap[{a,b}]+=c;
}
int ans=0;
while(fluxBfs())
{
for(auto e:adj[fin])
{
if(!vis[e]||cap[{e,fin}]==0) continue;
ret[fin]=e;
ans+=augmentPath(fin);
}
}
g<<ans<<'\n';
return 0;
}