Pagini recente » Cod sursa (job #3227375) | Cod sursa (job #7417) | Cod sursa (job #2415622) | Cod sursa (job #3265485) | Cod sursa (job #3260765)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
queue<int>q;
int n, m, a, b, c;
int capacitate[5005][5005], flux[5005][5005], father[5005];
bool viz[5005];
vector<int>graph[5005];
bool parcurgere()
{
for (int i=1; i<=n; ++i)
{
viz[i]=0;
}
viz[1]=1;
q.push(1);
while (!q.empty())
{
int nod=q.front();
q.pop();
if (nod==n)
return 1;
for (auto &v:graph[nod])
{
if (!viz[v] && flux[nod][v]!=capacitate[nod][v])
{
viz[v]=1;
father[v]=nod;
q.push(v);
}
}
}
return 0;
}
void solve()
{
int flux_maxim=0;
int mini;
while (parcurgere())
{
while (!q.empty())
q.pop();
for (auto &v:graph[n])
{
if (viz[v] && flux[v][n]!=capacitate[v][n])
{
mini=0x3f3f3f3f;
father[n]=v;
for (int nod=n; nod!=1; nod=father[nod])
{
mini=min(mini,capacitate[father[nod]][nod]-flux[father[nod]][nod]);
}
flux_maxim+=mini;
if (mini!=0)
{
for (int nod=n; nod!=1; nod=father[nod])
{
flux[father[nod]][nod]+=mini;
flux[nod][father[nod]]-=mini;
}
}
}
}
}
g << flux_maxim;
}
int main()
{
f >> n >> m;
for (int i=1; i<=m; ++i)
{
f >> a >> b >> c;
graph[a].push_back(b);
graph[b].push_back(a);
capacitate[a][b]=c;
}
solve();
return 0;
}