Pagini recente » Cod sursa (job #2774420) | Cod sursa (job #403380) | Cod sursa (job #2345518) | Cod sursa (job #2816073) | Cod sursa (job #1514119)
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>
#define DIM 205
using namespace std;
ifstream fin("harta.in");
ofstream fout("harta.out");
int N,M;
int C[DIM][DIM], F[DIM][DIM],T[DIM], minim, flux;
bitset <DIM> inQueue;
vector <int> L[DIM];
queue <int> Q;
int BFS(){
inQueue.reset();
int gasit =0;
Q.push(0);
inQueue[0]=1;
while(!Q.empty()){
int nod = Q.front();
Q.pop();
for(int i=0;i<L[nod].size();i++){
int vec = L[nod][i];
if(!inQueue[vec] && C[nod][vec] > F[nod][vec]){
Q.push(vec);
inQueue[vec]=1;
T[vec]=nod;
if(vec == 2*N+1)
gasit=1;
}
}
}
return gasit;
}
int main(){
fin >> N;
for(int i=1;i<=N;i++){
int x,y;
fin >> x >> y;
C[0][i] = x;
L[0].push_back(i);
L[i].push_back(0);
C[N+i][2*N+1] = y;
L[N+i].push_back(2*N+1);
L[2*N+1].push_back(N+i);
}
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(i!=j){
C[i][N+j] = 1;
L[i].push_back(N+j);
L[N+j].push_back(i);
}
while(BFS()){
for(int i=0;i<L[2*N+1].size();i++){
int p = L[2*N+1][i];
if(C[p][2*N+1] > F[p][2*N+1] && inQueue[p]==1){
minim = C[p][2*N+1] - F[p][2*N+1];
int u=p;
while(u!=0){
if(C[T[u]][u] - F[T[u]][u] < minim)
minim = C[T[u]][u] - F[T[u]][u];
u=T[u];
}
flux += minim;
F[p][2*N+1] += minim;
F[2*N+1][p] -= minim;
u=p;
while(u!=0){
F[T[u]][u] += minim;
F[u][T[u]] -= minim;
u = T[u];
}
}
}
}
fout << flux << "\n";
for(int i=1;i<=N;i++)
for(int j=N+1;j<=2*N;j++)
if(F[i][j]==1)
fout << i << " " << j - N << "\n";
return 0;
}