Pagini recente » Cod sursa (job #2567011) | Cod sursa (job #299827) | Cod sursa (job #297668) | Cod sursa (job #2761548) | Cod sursa (job #3188762)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
vector<int> vec[205], vpar; //lista si v de par
int m[205][205], sursa = 0, dest = 204; //matrice de capacitate
int bfs(vector<int> &vpar){
vpar.assign(205, -1);
vpar[sursa] = -2;
queue<pair<int, int>> q;
q.push({sursa, INT_MAX / 8});
int nodc, y, nodsucc;
while(!q.empty()){
nodc = q.front().first;
y = q.front().second;
q.pop();
for(auto vec2: vec[nodc])
if(vpar[vec2] == -1 && m[nodc][vec2]){
vpar[vec2] = nodc;
nodsucc = min(y, m[nodc][vec2]);
if(vec2 == dest)
return nodsucc;
q.push({vec2, nodsucc});
}
}
return 0;
}
void ad_muchie(int x, int y, int val){ //functie sa adaug muchii in graf
vec[x].push_back(y);
vec[y].push_back(x);
m[x][y] = val;
m[y][x] = 0;
}
int main()
{
int N, x, y, rez = 0; //citire date de intrare
ifstream fin("harta.in");
fin>>N;
for(int i = 1; i <= N; i++){
fin>>x>>y;
rez += x;
ad_muchie(sursa, i, x);
if(i <= 100)
ad_muchie(i + 100, dest, y);
else
ad_muchie(i - 100, dest, y);
}
fin.close();
for(int i = 1; i <= N; i++) //adaug muchii intre orase(formez un graf bipartit complet)
for(int j = 1; j <= N; j++)
if(i != j)
if(i <= 100)
ad_muchie(i, j + 100, 1);
else
ad_muchie(i, j - 100, 1);
int nodc, par, nodsucc;
nodsucc = bfs(vpar);
while(nodsucc != 0){ //gasesc fluxul maxim
nodc = dest;
while(nodc != sursa){
par = vpar[nodc];
m[par][nodc] -= nodsucc;
m[nodc][par] += nodsucc;
nodc = vpar[nodc];
}
nodsucc = bfs(vpar);
}
ofstream fout("harta.out");
fout<<rez<<"\n";
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
if(i != j && !m[i][j + 100] && j <= 100)
fout<<i<<" "<<j<<"\n";
else if(i != j && !m[i][j - 100] && j > 100)
fout<<i<<" "<<j<<"\n";
fout.close();
return 0;
}