Pagini recente » Istoria paginii runda/kod_tesztel3 | Cod sursa (job #1815073) | Cod sursa (job #1663417) | Cod sursa (job #2967054) | Cod sursa (job #1739714)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 1024
#define INF 1000000000
int capacity[MAX][MAX];
int residualCapacity[MAX][MAX];
int parent[MAX];
vector<int> listaAdiacenta[MAX];
int numarNoduri;
int numarMuchii;
int noduriVizitate[MAX];
ifstream in("maxflow.in");
void ConstruireListaAdiacenta(int nod1, int nod2)
{
listaAdiacenta[nod1].push_back(nod2);
listaAdiacenta[nod2].push_back(nod1);
}
void ConstruireMatriceCapacitate()
{
int nod1;
int nod2;
int capacitate;
for (int i = 1; i <= numarMuchii; ++i)
{
in>> nod1>> nod2 >> capacitate;
capacity[nod1][nod2] += capacitate;
ConstruireListaAdiacenta(nod1, nod2);
}
}
int BFS()
{
int nod;
queue<int> tail;
tail.push(1);
fill(noduriVizitate, noduriVizitate + numarNoduri + 1, 0);
noduriVizitate[1] = 1;
while( !tail.empty() )
{
nod = tail.front();
tail.pop();
for ( auto &it : listaAdiacenta[nod] )
{
if (capacity[nod][it] == residualCapacity[nod][it] || noduriVizitate[it] )
{
continue;
}
noduriVizitate[it] = 1;
tail.push(it);
parent[it] = nod;
if (it == numarNoduri)
{
return 1;
}
}
}
return 0;
}
int MaxFlow()
{
int flowMax;
int flowMin;
int nod;
for (flowMax = 0; BFS(); flowMax += flowMin)
{
flowMin = INF;
for (nod = numarNoduri; nod != 1; nod = parent[nod])
{
flowMin = min(flowMin, capacity[ parent[nod] ][nod] - residualCapacity[ parent[nod] ][nod]);
}
for (nod = numarNoduri; nod != 1; nod = parent[nod])
{
residualCapacity[ parent[nod] ][nod] += flowMin;
residualCapacity[nod][ parent[nod] ] -= flowMin;
}
}
return flowMax;
}
int main()
{
in>> numarNoduri>> numarMuchii;
ConstruireMatriceCapacitate();
ofstream out("maxflow.out");
out<< MaxFlow();
in.close();
out.close();
return 0;
}