isshift.cpp
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Dados dos grafos escribir una funcion
#bool is_shift(graph_t &G1,graph_t &G2,int m);#
que determina si #G2# es un `shift' de #G1#, es
decir la arista #(x,y)# esta en #G1# si y solo si #(x+m,y+m)#
esta en #G2#.
[Tomado en el TPL2 2013-10-12].
keywords: correspondencia
FIN DE DESCRIPCION */
#include <cstdio>
#include <iostream>
#include <map>
#include <list>
#include "./util.h"
using namespace std ;
//--------------------------------------------------------------------
typedef map<int, list<int> > graph_t;
bool is_shift(graph_t &G1,graph_t &G2,int m) {
if (G1.size()!=G2.size()) return false;
graph_t::iterator q1 = G1.begin(), q2;
while (q1!=G1.end()) {
q2 = G2.find(q1->first+m);
if (q2==G2.end()) return false;
list<int>
&L1 = q1->second,
&L2 = q2->second;
list<int>::iterator
p1 = L1.begin(),
p2 = L2.begin();
while (p1!=L1.end() && p2!=L2.end()) {
if (*p2!=*p1+m) return false;
p1++; p2++;
}
q1++;
}
return true;
}
#if 0
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool is_shift(graph_t &G1,graph_t &G2,int m) {
return is_shift1(G1,G2,m) && is_shift1(G2,G1,-m);
}
#endif
//--------------------------------------------------------------------
int main() {
graph_t G1,G2;
int m=3;
for (int j=0; j<10; j++) {
int v = 2*j;
list<int> &L1 = G1[v];
L1.push_back(j);
L1.push_back(j+1);
L1.push_back(j+2);
list<int> &L2 = G2[v+m];
L2.push_back(j+m);
L2.push_back(j+1+m);
L2.push_back(j+2+m);
}
printf("is_shift(G1,G2,%d) -> %d\n",m,is_shift(G1,G2,m));
int m2=4;
printf("is_shift(G1,G2,%d) -> %d\n",m2,is_shift(G1,G2,m2));
return 0;
}
Generated by GNU Enscript 1.6.6.