Pagini recente » Cod sursa (job #3228347) | Cod sursa (job #2727721) | Cod sursa (job #43386) | Cod sursa (job #1686132) | Cod sursa (job #668362)
Cod sursa(job #668362)
#include <stdio.h>
#include <vector>
#include <queue>
#define MAXNODURI 1000
using namespace std;
int nrnoduri, nrmuchii, source, sink;
int capacitati[MAXNODURI][MAXNODURI],
flow[MAXNODURI][MAXNODURI],
tata[MAXNODURI];
vector<int> *vecini;
int start, end, capacitate, i, j, sol;
bool parcurge()
{
vector<bool> viz(nrnoduri + 1, 0);
queue<int> coada;
coada.push(source);
viz[source] = true;
while(!coada.empty())
{
start = coada.front();
if(start != sink)
for(i = 0;i < (signed)vecini[start].size();i++)
{
end = vecini[start][i];
if(!viz[end] && flow[start][end] < capacitati[start][end])
{
viz[end] = true;
tata[end] = start;
coada.push(end);
}
}
coada.pop();
}
return viz[sink];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &nrnoduri, &nrmuchii);
vecini = new std::vector<int>[nrnoduri+1];
for(i = 0;i < nrmuchii;i++)
{
scanf("%d %d %d", &start, &end, &capacitate);
capacitati[start][end] += capacitate;
vecini[start].push_back(end);
vecini[end].push_back(start);//necesar?
}
source = 1;
sink = nrnoduri;
while(parcurge())
{
for(i = source;i < nrnoduri;i++)
if(tata[i] && flow[i][sink] < capacitati[i][sink])
{
int Min = capacitati[i][sink] - flow[i][sink];
for(j = i;j != source;j = tata[j])
Min = min(Min, capacitati[tata[j]][j] - flow[tata[j]][j]);
if(Min)//daca e 0 inseamna ca am gasit deja drum pe acolo
{
flow[i][sink] += Min;
flow[sink][i] -= Min;
for(j = i;j != source;j = tata[j])
{
flow[tata[j]][j] += Min;
flow[j][tata[j]] -= Min;
}
sol += Min;
}
}
}
printf("%d", sol);
}