Pagini recente » Cod sursa (job #2875881) | Cod sursa (job #1361267) | Cod sursa (job #2232253) | Cod sursa (job #2754629) | Cod sursa (job #2959974)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
int radacina, destinatie, n, m, dist1, dist2, cost, total, l, r, tati[202], flux[202][202], viz[202];
vector<vector<int>>adiacenta;
ifstream f("harta.in");
ofstream g("harta.out");
bool bfs()
{
queue<int> q;
for(int i =0; i <= 2 * n + 1; ++i)
{
tati[i] = -1;
viz[i] = 0;
}
viz[0] = 1;
q.push(0);
while(!q.empty())
{
int aux = q.front();
q.pop();
for(auto element : adiacenta[aux])
{
if(viz[element] == 0 && flux[aux][element] > 0)
{
tati[element] = aux;
q.push(element);
viz[element] = 1;
if(element == 2 * n + 1) return 1;
}
}
}
return 0;
}
int main()
{
f>>n;
adiacenta.resize(2 * n + 2);
for(int i = 1; i <= n; ++i)
{
f>>dist1>>dist2;
flux[0][i] = dist1;
flux[n + i][2 * n + 1] = dist2;
adiacenta[0].push_back(i);
adiacenta[i].push_back(0);
adiacenta[n + i].push_back(2 * n + 1);
adiacenta[2 * n + 1].push_back(n + 1);
for(int j = n + 1; j <= 2 * n; ++j)
{
if(j - i == n)
continue;
adiacenta[i].push_back(j);
adiacenta[j].push_back(i);
flux[i][j] = 1;
}
}
while(bfs())
{
for(auto element : adiacenta[n])
{
if(!viz[element]) continue;
int minim = INT_MAX;
int aux = 2 * n + 1;
while(aux != 0)
{
minim = min(minim, flux[tati[aux]][aux]);
aux = tati[aux];
}
aux = 2 * n + 1;
while(aux != 0)
{
flux[tati[aux]][aux] -= minim;
flux[aux][tati[aux]] += minim;
aux = tati[aux];
}
total += minim;
}
}
g<<total<<"\n";
for(int i = 1; i <= n; ++i)
for(int j = n + 1; j <= 2 * n + 1; ++j)
if(flux[j][i] == 1)
{
g<<i<<" "<<j - n<<"\n";
continue;
}
}