Pagini recente » Cod sursa (job #651157) | Cod sursa (job #1842320) | Cod sursa (job #106137) | Cod sursa (job #2929863) | Cod sursa (job #2878575)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const string filename = "maxflow";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int maxN = 1005, inf = 0x3f3f3f3f;
int n, m, dist[maxN], sursa, dest, drum[maxN], max_flux;
bool viz[maxN];
struct muchie {
int nxt, cap;
};
vector <muchie> lm;
vector <int> G[maxN];
void get_dist()
{
for(int i = 1; i <= n; i++)
{
dist[i] = inf;
viz[i] = 0;
drum[i] = -1;
}
dist[dest] = 1;
queue <int> q2;
q2.push(dest);
while(!q2.empty())
{
int nod = q2.front();
q2.pop();
for(int ind : G[nod])
{
int vecin = lm[ind].nxt;
if(lm[ind ^ 1].cap && dist[vecin] == inf)
{
dist[vecin] = dist[nod] + 1;
q2.push(vecin);
}
}
}
}
bool bfs()
{
get_dist();
if(dist[sursa] == inf)
return 0;
queue <int> q;
q.push(sursa);
viz[sursa] = 1;
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == dest)
return 1;
for(int ind : G[nod])
{
int vecin = lm[ind].nxt;
if(dist[vecin] != dist[nod] - 1)
continue;
if(!viz[vecin] && lm[ind].cap)
{
drum[vecin] = ind;
viz[vecin] = 1;
q.push(vecin);
}
}
}
return 0;
}
int main()
{
fin >> n >> m;
sursa = 1, dest = n;
for(int i = 1; i <= m; i++)
{
int x, y, cap;
fin >> x >> y >> cap;
G[x].push_back(lm.size());
lm.push_back({y, cap});
G[y].push_back(lm.size());
lm.push_back({x, 0});
}
while(bfs())
{
int min_flux = inf, arc = drum[dest];
while(arc != -1)
{
int nod = lm[arc ^ 1].nxt;
min_flux = min(min_flux, lm[arc].cap);
arc = drum[nod];
}
arc = drum[dest];
while(arc != -1)
{
int nod = lm[arc ^ 1].nxt;
lm[arc].cap -= min_flux;
lm[arc ^ 1].cap += min_flux;
arc = drum[nod];
}
max_flux += min_flux;
}
fout << max_flux;
return 0;
}