Pagini recente » Cod sursa (job #1901431) | Cod sursa (job #2852669) | Cod sursa (job #2840744) | Cod sursa (job #3157553) | Cod sursa (job #3225564)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int NMAX=5e5,inf=1e9;
int n,m,lv[NMAX+5],ptr[NMAX+5];
vector <int> v[NMAX+5];
vector <pair<pair<int,int>,pair<int,int> > > edge;
int bfs(int s,int t)
{
lv[s]=0;
queue <int> q;
q.push(s);
while (!q.empty())
{
auto t=q.front();
q.pop();
for (int i=0;i<v[t].size();++i)
{
if (lv[edge[v[t][i]].first.second]==-1&&edge[v[t][i]].second.first>edge[v[t][i]].second.second)
{
q.push(edge[v[t][i]].first.second);
lv[edge[v[t][i]].first.second]=lv[t]+1;
}
}
}
return lv[t];
}
int dfs(int nod,int sink,int flow)
{
if (flow==0) return 0;
if (nod==sink) return flow;
for (;ptr[nod]<v[nod].size();++ptr[nod])
{
auto t=edge[v[nod][ptr[nod]]];
if (lv[t.first.first]+1!=lv[t.first.second]||(!(t.second.first>t.second.second))) continue;
int f=dfs(t.first.second,sink,min(flow,t.second.first-t.second.second));
if (f==0) continue;
edge[v[nod][ptr[nod]]].second.second+=f;
edge[v[nod][ptr[nod]]^1].second.second-=f;
return f;
}
return 0;
}
int dinic(int s,int t)
{
int flow=0;
while (true)
{
for (int i=1;i<=n;++i)
lv[i]=-1;
if (bfs(s,t)==-1) break;
for (int i=1;i<=n;++i)
ptr[i]=0;
while (true)
{
int f=dfs(s,t,inf);
flow+=f;
if (f==0) break;
}
}
return flow;
}
int main()
{
in>>n>>m;
int cnt=0;
for (int i=1;i<=m;++i)
{
int x,y,z;
in>>x>>y>>z;
if (z==0) continue;
v[x].push_back(cnt);
v[y].push_back(cnt+1);
edge.push_back({{x,y},{z,0}});
edge.push_back({{y,x},{0,0}});
cnt+=2;
}
out<<dinic(1,n);
return 0;
}