Pagini recente » Cod sursa (job #3165415) | Cod sursa (job #2302388) | Cod sursa (job #2711505) | Cod sursa (job #2346635) | Cod sursa (job #3261803)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int N=1001;
const int inf=1e9;
vector<int>adj[N];
int capacitate[N][N];
int n,m;
int parent[N];
void init()
{
for(int i=1; i<=n; i++)
parent[i]=-1;
parent[1]=0;
}
struct flow
{
int nod,capacitate;
};
void tie(int &a,int &b, flow x)
{
a=x.nod;
b=x.capacitate;
}
int size_of=0;
int st[N];
int bfs(int start,int finish)
{
for(int i=1; i<=size_of; i++)
{
parent[st[i]]=-1;
}
size_of=0;
parent[1]=0;
queue<flow>q;
q.push({start,inf});
while(!q.empty())
{
int nod,flux;
nod=q.front().nod;
flux=q.front().capacitate;
q.pop();
for(auto u:adj[nod])
{
if(parent[u]==-1&&capacitate[nod][u])
{
size_of++;
st[size_of]=u;
flux=min(flux,capacitate[nod][u]);
parent[u]=nod;
if(u==finish)
{
return flux;
}
q.push({u,flux});
}
}
}
return 0;
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(int i=1; i<=m; i++)
{
int a,b,flux;
cin>>a>>b>>flux;
if(capacitate[a][b]==0)
{
adj[a].push_back(b);
adj[b].push_back(a);
}
capacitate[a][b]+=flux;
}
int ans=0;
int actual_flow;
init();
while(actual_flow=bfs(1,n))
{
ans+=actual_flow;
int cur=n;
while(cur!=1)
{
int prev=parent[cur];
capacitate[cur][prev]+=actual_flow;
capacitate[prev][cur]-=actual_flow;
cur=prev;
}
}
cout<<ans;
cin.close();
cout.close();
return 0;
}