Pagini recente » Cod sursa (job #1569165) | Cod sursa (job #1780777) | Cod sursa (job #2778975) | Cod sursa (job #3179589) | Cod sursa (job #3196212)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
class Flow
{
struct muchie
{
int to,cap,flow;
muchie(int b,int c,int d) : to(b),cap(c),flow(d) {}
};
private : vector<muchie> muchii; vector<vector<int>> vecini; vector<int> l,h; int s,t; const int oo = 1e9;
bool bfs()
{
fill(l.begin(),l.end(),0); l[s] = 1;
queue<int> q; q.push(s);
while(!q.empty())
{
int v = q.front(); q.pop();
for(auto &i : vecini[v])
{
int care = muchii[i].to;
if(!l[care] && (muchii[i].cap - muchii[i].flow > 0))
{
l[care] = l[v] + 1;
q.push(care);
}
}
}
return l[t];
}
int dfs(int a,int fl)
{
if(a == t) return fl;
for(int &i = h[a]; i < vecini[a].size() ; i++)
{
auto &care = muchii[vecini[a][i]];
if(l[a] + 1 == l[care.to] && (care.cap - care.flow > 0))
{
int rez = dfs(care.to,min(fl,care.cap - care.flow));
if(rez)
{
muchii[vecini[a][i]].flow += rez;
muchii[vecini[a][i]^1].flow -= rez;
return rez;
}
}
}
return 0;
}
public :
Flow(int n,int ss,int tt) : s(ss),t(tt)
{
vecini.resize(n + 1);
l.resize(n + 1); h.resize(n + 1);
}
void add(int a,int b,int c)
{
vecini[a].emplace_back(muchii.size());
muchii.push_back(muchie(b,c,0));
vecini[b].emplace_back(muchii.size());
muchii.push_back(muchie(a,0,0));
}
int maxflow()
{
int ans = 0;
while(bfs())
{
fill(h.begin(),h.end(),0);
int delta = dfs(s,oo);
while(delta)
{
ans += delta;
delta = dfs(s,oo);
}
}
return ans;
}
};
int main()
{
int n,m,a,b,c; cin >> n >> m;
Flow f(n,1,n); for(int i = 1; i <= m ; i++)
{
cin >> a >> b >> c;
f.add(a,b,c);
}
cout << f.maxflow();
}