inverse.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Dada una correspondencia #M# y asumiendo que es
_invertible_ o _biunivoca_ (esto es, todos
los valores del contradominio son distintos), la
correspondencia `inversa' #N# es aquella
tal que, si #y=M[x]#, entonces #x=N[y]#. Por
ejemplo, si #M={(0,1),(1,2),(2,0)}#, entonces la
inversa es #N={(1,0),(2,1,(0,2))}#. _Consigna:_
Escribir una funci\'on
#bool inverse(map<int,int> &M,map<int,int> &N)#
tal que, si #M# es invertible,
entonces retorna true y #N# es su inversa. En caso
contrario retorna falso y #N# es la correspondencia
`vacia' (sin asignaciones)
[Tomado en el 1er parcial del 20/4/2006].
keywords: lista, correspondencia
FIN DE DESCRIPCION */
#include <iostream>
#include <map>
#include "./util.h"
using namespace std ;
bool inverse(map<int,int> &M,map<int,int> &N) {
N.clear();
map<int,int>::iterator q = M.begin();
while (q!=M.end()) {
if (N.find(q->second)!=N.end()) {
N.clear();
return false;
}
N[q->second] = q->first;
q++;
}
return true;
}
void print_map(map<int,int> &M) {
map<int,int>::iterator q = M.begin();
while (q!=M.end()) {
cout << q->first << " -> " << q->second << endl;
q++;
}
}
void check(map<int,int> &M) {
map<int,int> N;
bool inversible = inverse(M,N);
cout << "M:\n";
print_map(M);
cout << "inversible: " << inversible << endl;
cout << "N:\n";
print_map(N);
cout << "--------------------\n";
}
//--------------------------------------------------------------------
int main() {
map<int,int> M, N;
// Light test
M[0] = 1;
M[1] = 2;
M[2] = 0;
check(M);
M[0] = 1;
M[1] = 2;
M[2] = 1;
check(M);
// Test harness
for (int j=0; j<10; j++) {
M.clear();
for (int k=0; k<10; k++) {
int
x = rand() % 10,
y = rand() % 20;
M[x] = y;
}
check(M);
}
}
// -----------------------------------------------------------------
//
Generated by GNU Enscript 1.6.6.