Pagini recente » Cod sursa (job #676681) | Cod sursa (job #328773) | Cod sursa (job #589999) | Cod sursa (job #2919011) | Cod sursa (job #2450309)
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <queue>
using namespace std;
const int N=1000+7;
const int inf=(int)1e9;
int n,m;
int e[N][N];
vector <int> g[N];
int flux_total;
int mx[N];
int par[N];
vector <pair <int,int>> ord[N];
int flux()
{
/// minimul sa fie maxim
for(int i=1;i<=n;i++)
{
ord[i].clear();
for(auto &j : g[i])
ord[i].push_back({e[i][j],j});
sort(ord[i].rbegin(),ord[i].rend());
}
for(int i=2;i<=n;i++)
mx[i]=-1;
mx[1]=inf;
priority_queue <pair <int,int>> pq;
pq.push({inf,1});
while (!pq.empty())
{
auto it=pq.top();
int nod=it.second;
pq.pop();
if(it.first!=mx[nod])
continue;
for(auto &it : ord[nod])
{
int j=it.second,posi=min(mx[nod],e[nod][j]);
if(posi>mx[j])
{
mx[j]=posi;
pq.push({mx[j],j});
par[j]=nod;
}
}
}
if(mx[n]==-1)
return 0;
int now=n;
while(now!=1)
{
int kid=par[now];
e[kid][now]-=mx[n];
e[now][kid]+=mx[n];
now=kid;
}
return mx[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
g[a].push_back(b);
g[b].push_back(a);
e[a][b]+=c;
}
while(1)
{
int a=flux();
if(!a)
break;
flux_total+=a;
}
cout<<flux_total<<"\n";
return 0;
}