Pagini recente » Cod sursa (job #733865) | Cod sursa (job #1682542) | Cod sursa (job #2481741) | Cod sursa (job #1609528) | Cod sursa (job #2960231)
#include <bits/stdc++.h>
#define inf 1e9
/// algoritmul lui Edmond karp
/// Complexitate timp : O (n*m^2)
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m;
int cap[1001][1001], res[1001][1001];
bool viz[1001];
int vecini[1001];
vector<int> graf[1001];
bool bfs()
{
memset(viz, false, sizeof(viz));
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n) continue;
for(int vecin : graf[nod])
{
if(viz[vecin] || cap[nod][vecin] == res[nod][vecin]) continue;
viz[vecin] = true;
vecini[vecin] = nod;
q.push(vecin);
}
}
return viz[n];
}
int main()
{
f>>n>>m;
int x, y;
for(int i = 0; i < m; ++i)
{
f>>x>>y;
f>>cap[x][y];
graf[x].push_back(y);
graf[y].push_back(x);
}
int flow_maxim = 0;
while(bfs())
{
for(int vecin : graf[n])
{
if(!viz[vecin] || cap[vecin][n] == res[vecin][n]) continue;
int flow = inf;
vecini[n] = vecin;
for(int nod = n; nod != 1; nod = vecini[nod])
flow = min(flow, cap[vecini[nod]][nod] - res[vecini[nod]][nod]);
if(!flow)
continue;
for(int nod = n; nod != 1; nod = vecini[nod])
{
res[vecini[nod]][nod] += flow;
res[nod][vecini[nod]] -= flow;
}
flow_maxim += flow;
}
}
g<<flow_maxim;
return 0;
}