Pagini recente » Cod sursa (job #268501) | Cod sursa (job #2566377) | Cod sursa (job #2615557) | Cod sursa (job #2700801) | Cod sursa (job #2897179)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int lim=1005;
struct edge
{
int nod;
int cap;
int rev;
};
pair<int,int> pred[lim];
vector<edge> vec[lim];
queue<int> q;
int n,m,x,y,z;
int main()
{
ios_base::sync_with_stdio(false);
in.tie(0),out.tie(0);
in>>n>>m;
for(int i=1;i<=m;++i)
{
in>>x>>y>>z;
int a=vec[x].size();
int b=vec[y].size();
vec[x].push_back({y,z,b});
vec[y].push_back({x,0,a});
}
int flow=0;
do
{
pred[1]={0,-1};
for(int i=2;i<=n;++i)
pred[i]={-1,-1};
q.push(1);
while(!q.empty())
{
int nod=q.front(); q.pop();
for(int i=0;i<vec[nod].size();++i)
if(pred[vec[nod][i].nod].first==-1 and vec[nod][i].cap>0)
pred[vec[nod][i].nod]={nod,i},q.push(vec[nod][i].nod);
}
if(pred[n].first!=-1)
for(int i=0;i<vec[n].size();++i)
if(vec[vec[n][i].nod][vec[n][i].rev].cap>0)
{
int ind=vec[n][i].rev;
int last=vec[n][i].nod;
int minim=vec[last][ind].cap;
for(int u=last;pred[u].first>0;u=pred[u].first)
minim=min(minim,vec[pred[u].first][pred[u].second].cap);
if(minim==0)
continue;
flow+=minim;
vec[last][ind].cap-=minim;
vec[n][i].cap+=minim;
for(int u=last;pred[u].first>0;u=pred[u].first)
vec[pred[u].first][pred[u].second].cap-=minim,
vec[u][vec[pred[u].first][pred[u].second].rev].cap+=minim;
}
}while(pred[n].first!=-1);
out<<flow<<'\n';
return 0;
}