Pagini recente » Cod sursa (job #164249) | Cod sursa (job #2923146) | Cod sursa (job #933796) | Cod sursa (job #924680) | Cod sursa (job #2886014)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
using T=int;
struct Dinic
{
struct Edge
{
int a,b,ult;
T flow,cap;
};
vector <Edge> es;
vector <int> last,dist,coada;
Dinic(int n)
{
last.assign(n+1,-1);
}
void AddEdge(int a,int b,T c)
{
es.push_back({a,b,last[a],0,c});
last[a]=es.size()-1;
es.push_back({b,a,last[b],0,0});
last[b]=es.size()-1;
}
bool bfs(int s,int t,T pas)
{
coada.clear();
dist.assign(last.size(),-1);
dist[s]=0;
coada.push_back(s);
for(int i=0; i<coada.size(); i++)
{
int it=coada[i];
for(int x=last[it]; x!=-1; x=es[x].ult)
{
if(dist[es[x].b]==-1&&es[x].cap-es[x].flow>=pas)
{
dist[es[x].b]=dist[it]+1;
coada.push_back(es[x].b);
}
}
}
//for(int i=1;i<last.size();i++)
//cout<<dist[i]<<" ";
//cout<<'\n';
return (dist[t]!=-1);
}
bool dfs(int s,int t,T pas)
{
if(s==t)
return 1;
for(int x=last[s]; x!=-1; x=es[x].ult)
{
if(dist[es[x].b]==dist[s]+1&&es[x].cap-es[x].flow>=pas)
{
if(dfs(es[x].b,t,pas))
{
es[x].flow+=pas;
es[x^1].flow-=pas;
return 1;
}
}
}
return 0;
}
int Compute(int s,int t)
{
int pas=1<<16,rez=0;
while(pas)
{
while(bfs(s,t,pas))
while(dfs(s,t,pas))
rez+=pas;
pas/=2;
}
return rez;
}
};
int main()
{
int n,m,i,a,b,c;
in>>n>>m;
Dinic d(n);
for(i=1; i<=m; i++)
{
in>>a>>b>>c;
d.AddEdge(a,b,c);
}
out<<d.Compute(1,n);
return 0;
}