Pagini recente » Cod sursa (job #3191759) | Cod sursa (job #2546838) | Cod sursa (job #2619054) | Cod sursa (job #194336) | Cod sursa (job #2273771)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int N=1000+5;
int n,m;
vector<pair<int,int>>g[N];
bool is[N],ie[N];
int ma[N];
int s=0;
int e=0;
inline void sloveMA(int nod)
{
if(ma[nod]!=-1) return;
for(auto &it:g[nod])
{
int nou=it.first;
int co=it.second;
if(nou==e)
{
ma[nod]=max(ma[nod],co);
}
else
{
sloveMA(nou);
ma[nod]=max(ma[nod],min(ma[nou],co));
}
}
}
inline int fPath()
{
for(int i=1;i<=n;i++) ma[i]=-1;
ma[e]=0;
sloveMA(s);
int nod=s;
while(1)
{
bool ok=0;
for(int i=0;i<g[nod].size();i++)
{
int nou=g[nod][i].first;
int co=g[nod][i].second;
if(nou==e)
{
ok=1;
break;
}
if(min(ma[nou],co)==ma[nod])
{
g[nod][i].second-=ma[s];
nod=nou;
break;
}
}
if(ok) break;
}
return ma[s];
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++) is[i]=ie[i]=1;
for(int i=1;i<=m;i++)
{
int a,b,x;
fin>>a>>b>>x;
g[a].push_back({b,x});
is[b]=0;
ie[a]=0;
}
for(int i=1;i<=n;i++)
{
if(is[i]) s=i;
if(ie[i]) e=i;
}
int ans=0;
while(1)
{
int x=fPath();
if(!x) break;
ans+=x;
}
fout<<ans<<"\n";
return 0;
}