Sea una matriz de enteros. Esta matriz representa una tabla de datos de filas y columnas ( y ).
Decimos que la dependencia funcional
x -> y entre dos columnas x y
y, es válida en la matriz M
si y solo si para todo par de filas i y
j (donde
)
ocurre lo siguiente:
cuando las dos filas i y j tienen el
mismo valor en la columna x, entonces también tienen el
mismo valor en la columna y.
Por ejemplo, sea la tabla (matriz) M de 5 filas y 4
columnas:
| 1 | 2 | 2 | 5 |
| 3 | 5 | 4 | 1 |
| 1 | 2 | 2 | 5 |
| 2 | 1 | 3 | 2 |
| 2 | 1 | 3 | 1 |
Consideremos la dependencia funcional 0 -> 1. Vemos
que los valores de la columna 0 coinciden en las filas 0 y
2:
| 1 | 2 | 2 | 5 |
|---|---|---|---|
| 1 | 2 | 2 | 5 |
y también en las filas 3 y 4:
| 2 | 1 | 3 | 2 |
|---|---|---|---|
| 2 | 1 | 3 | 1 |
Y vemos que en ambos casos los valores de la columna 1
también son iguales. Y esto ocurre para todo par de
filas. Por tanto, la dependencia funcional 0 -> 1 es
válida.
En cambio, la dependencia funcional 0 -> 3
no es válida porque aunque, por ejemplo, los valores de
las columnas 0 y 3 coinciden en las filas 0 y
2:
| 1 | 2 | 2 | 5 |
|---|---|---|---|
| 1 | 2 | 2 | 5 |
no ocurre lo mismo en las filas 3 y 4, en las que coinciden los
valores de la columna 0, pero no los valores de la columna
3:
| 2 | 1 | 3 | 2 |
|---|---|---|---|
| 2 | 1 | 3 | 1 |
En este caso, podemos decir que las filas 3 y 4
invalidan 0 -> 3.
Tened en cuenta que, dada una dependencia funcional
x -> y (donde x y y son
identificadores de columnas), si los valores de x no
coinciden en dos filas, entonces estas dos filas no pueden invalidar la
dependencia funcional, independientemente de si los valores de la
columna y son o no iguales. Por ejemplo, las filas 0 y 1 no
tienen el mismo valor en la columna 0:
| 1 | 2 | 2 | 5 |
|---|---|---|---|
| 3 | 5 | 4 | 1 |
Por tanto, no pueden invalidar la dependencia 0 -> 1
aunque el valor de la columna 1 tampoco coincida.
Haz una función dependencia_funcional con la siguiente
declaración y especificación:
/*
* PRE: M.size() > 0 and M[0].size() > 0 and 0 <= x,y < M[0].size().
*
* POST: Devuelve true si y solo si la dependencia funcional x -> y
* es válida en la matriz M.
*/
bool dependencia_funcional(const Matriu& M, int x, int y);
Solo hay que enviar la función que se pide (y las funciones que hayáis podido declarar vosotros).
Además, en el fichero que enviéis debe aparecer también esto:
#include <iostream>
#include <vector>
using namespace std;
typedef vector <int> Vector;
typedef vector<Vector> Matriu;
No se puede usar la ordenación de C++:
std::sort. Tampoco se puede usar el método
push_back() de la clase vector.
Si queréis, podéis usar las funciones min,
max o swap.
Hay que tener en cuenta que la relación entre dos filas
i y j respecto a la dependencia
x -> y es simétrica. Es decir, si el
par de filas i y j no invalidan la dependencia
x -> y, el par j y i tampoco.
Por eso en la definición de la dependencia especificamos
.
La entrada es una matriz y una secuencia de dependencias funcionales. De la lectura ya se encarga el programa principal.
La salida son los resultados para cada dependencia funcional. De la escritura también se encarga el programa principal.
Input
5 4 1 2 2 5 3 5 4 1 1 2 2 5 2 1 3 2 2 1 3 1 0 -> 1 0 -> 2 0 -> 3 1 -> 0 1 -> 2 1 -> 3 2 -> 0 2 -> 1 2 -> 3 3 -> 0 3 -> 1 3 -> 2
Output
0->1 SI 0->2 SI 0->3 NO 1->0 SI 1->2 SI 1->3 NO 2->0 SI 2->1 SI 2->3 NO 3->0 NO 3->1 NO 3->2 NO
Input
2 5 1 2 2 5 2 2 1 3 2 4 0 -> 1 0 -> 2 0 -> 3 0 -> 4 1 -> 0 1 -> 2 1 -> 3 1 -> 4 2 -> 0 2 -> 1 2 -> 3 2 -> 4 3 -> 0 3 -> 1 3 -> 2 3 -> 4 4 -> 0 4 -> 1 4 -> 2 4 -> 3
Output
0->1 SI 0->2 SI 0->3 SI 0->4 SI 1->0 SI 1->2 SI 1->3 SI 1->4 SI 2->0 SI 2->1 SI 2->3 SI 2->4 SI 3->0 SI 3->1 SI 3->2 SI 3->4 SI 4->0 SI 4->1 SI 4->2 SI 4->3 SI
Input
3 3 0 0 0 1 0 2 0 0 0 0 -> 1 0 -> 2 1 -> 0 1 -> 2 2 -> 0 2 -> 1
Output
0->1 SI 0->2 SI 1->0 NO 1->2 NO 2->0 SI 2->1 SI