Mai intai trebuie sa te autentifici.
Cod sursa(job #1460835)
Utilizator | Data | 14 iulie 2015 01:44:54 | |
---|---|---|---|
Problema | Flux maxim | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.19 kb |
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<pair<int, int>, int> > nod[1001];
int vizitat[1001];
int fluxm = 0;
int n;
struct el
{
int care;
int delacine;
int alcateleainlista;
};
void baga(int c)
{
int i,j,gata,k,primesc;
vizitat[1] = c;
el a;
a.care = 1;
a.delacine = -1;
a.alcateleainlista = 0;
vector<el> coada;
coada.push_back(a);
for (i = 0; i < coada.size(); i++)
{
gata = 0;
for (j = 0; j < nod[coada[i].care].size(); j++)
{
if (nod[coada[i].care][j].first.first == n&&nod[coada[i].care][j].first.second>0)
{
gata = 1;
k = i;
primesc = nod[coada[i].care][j].first.second;
while (k != 0)
{
primesc = min(primesc, nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].first.second);
k = coada[k].delacine;
}
if (primesc <= 0)
{
gata = 1;
break;
}
k = i;
fluxm += primesc;
nod[coada[i].care][j].first.second -= primesc;
nod[n][nod[coada[i].care][j].second].first.second += primesc;
while (k > 0)
{
nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].first.second -= primesc;
nod[coada[k].care][nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].second].first.second += primesc;
k = coada[k].delacine;
}
break;
}
}
if (gata == 1){ continue; }
for (j = 0; j < nod[coada[i].care].size(); j++)
{
if (vizitat[nod[coada[i].care][j].first.first] != c&&nod[coada[i].care][j].first.second>0)
{
vizitat[nod[coada[i].care][j].first.first] = c;
a.care = nod[coada[i].care][j].first.first;
a.delacine = i;
a.alcateleainlista = j;
coada.push_back(a);
}
}
}
}
void flux()
{
int i;
int acum=-1;
for (i = 1; fluxm > acum; i++)
{
acum = fluxm;
baga(i);
}
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int i,m,x,y,z;
in >> n;
in >> m;
for (i = 1; i <= m; i++)
{
in >> x;
in >> y;
in >> z;
nod[x].push_back(make_pair(make_pair(y, z),nod[y].size()));
nod[y].push_back(make_pair(make_pair(x, 0), nod[x].size() - 1));
}
flux();
out << fluxm;
}