Pagini recente » Cod sursa (job #1606445) | Cod sursa (job #1764879) | Cod sursa (job #1133211) | Cod sursa (job #570068) | Cod sursa (job #1946940)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int noduri, muchii, inceput, sf, in, t[1005], sfarsit, capac, minim, total;
map <string, int> cost;
vector <int> matrice[1005];
struct tine
{
int val, last;
}pahar;
vector <tine> coada;
int capacitate(int a, int b)
{
string x = "";
x += a;
x += ".";
x += b;
return cost[x];
}
void adauga(int a, int b, int adaos)
{
string x = "";
x += a;
x += ".";
x += b;
cost[x] += adaos;
}
void scade(int minim)
{
int cine = in;
while(coada[cine].last != -1)
{
adauga(coada[coada[cine].last].val, coada[cine].val, -minim);
adauga(coada[cine].val, coada[coada[cine].last].val, minim);
cine = coada[cine].last;
}
}
void refa()
{
int minim = 110000002;
//cout << noduri << ' '; //matrice[coada[in].val][i].sfarsit
minim = min(minim, capacitate(coada[in].val, noduri));
int cine = in;
while(coada[cine].last != -1)
{
minim = min(minim, capacitate(coada[coada[cine].last].val, coada[cine].val));
//cout << coada[cine].val << ' ';
cine = coada[cine].last;
}
//cout << coada[cine].val;
//cout << " - " << minim;
//cout << '\n';
scade(minim);
total += minim;
for(int i=0; i <= noduri; i++)
t[i] = 0;
in = -1;
sf = 0;
coada.clear();
pahar.last = -1;
pahar.val = 1;
coada.push_back(pahar);
}
int main()
{
cin >> noduri >> muchii;
for(int i=1; i <= muchii; i++)
{
cin >> inceput >> sfarsit >> capac;
adauga(inceput, sfarsit, capac);
matrice[inceput].push_back(sfarsit);
}
pahar.last = -1;
pahar.val = 1;
coada.push_back(pahar);
in = 0;
sf = 0;
while(in <= sf)
{
for(int i=0; i < matrice[coada[in].val].size(); i++)
{
if(t[matrice[coada[in].val][i]] == 0 && capacitate(coada[in].val, matrice[coada[in].val][i]) > 0)
{
if(matrice[coada[in].val][i] == noduri)
{
refa();
break;
}
else
{
sf++;
pahar.val = matrice[coada[in].val][i];
pahar.last = in;
coada.push_back(pahar);
t[matrice[coada[in].val][i]] = 1;
}
}
}
in++;
}
cout << total;
}