#include <iostream>
#include <memory>
#include <vector>
#include <functional>
class Node
{
public:
Node ( std::string name ) : name__ (name){}
std::string name__;
bool operator== ( const Node & rhs ) const
{
return this->name__ == rhs.name__;
}
};
struct Edge
{
std::shared_ptr<Node> from;
std::shared_ptr<Node> to;
};
int main()
{
auto sky_node = std::make_shared<Node>( "sky" );
auto is_node = std::make_shared<Node>( "is" );
auto blue_node = std::make_shared<Node>( "blue" );
std::vector<Edge> edges = { {sky_node, is_node}, {is_node, blue_node} };
std::function<void ( const std::shared_ptr<Node>, unsigned int )> find_next;
find_next = [=]( const std::shared_ptr<Node> node_to, unsigned int len )
{
for ( const auto rhs : edges )
{
if ( (*node_to) == (*rhs.from) )
{
len++;
find_next ( rhs.from, len );
}
}
};
for ( const auto lhs : edges )
{
unsigned int len = 0;
const auto from = lhs.to;
find_next ( from, len );
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIE5vZGUKewpwdWJsaWM6CglOb2RlICggc3RkOjpzdHJpbmcgbmFtZSApIDogbmFtZV9fIChuYW1lKXt9CgoJc3RkOjpzdHJpbmcgbmFtZV9fOwoJCglib29sIG9wZXJhdG9yPT0gKCBjb25zdCBOb2RlICYgcmhzICkgY29uc3QKCXsKCQlyZXR1cm4gdGhpcy0+bmFtZV9fID09IHJocy5uYW1lX187Cgl9Cn07CgpzdHJ1Y3QgRWRnZQp7CglzdGQ6OnNoYXJlZF9wdHI8Tm9kZT4gZnJvbTsKCXN0ZDo6c2hhcmVkX3B0cjxOb2RlPiB0bzsKfTsKCmludCBtYWluKCkgCnsKCWF1dG8gc2t5X25vZGUgID0gc3RkOjptYWtlX3NoYXJlZDxOb2RlPiggInNreSIgKTsKICAgIGF1dG8gaXNfbm9kZSAgID0gc3RkOjptYWtlX3NoYXJlZDxOb2RlPiggImlzIiApOwogICAgYXV0byBibHVlX25vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPE5vZGU+KCAiYmx1ZSIgKTsKCQoJc3RkOjp2ZWN0b3I8RWRnZT4gZWRnZXMgPSB7IHtza3lfbm9kZSwgaXNfbm9kZX0sIHtpc19ub2RlLCBibHVlX25vZGV9IH07CgkKCXN0ZDo6ZnVuY3Rpb248dm9pZCAoIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOb2RlPiwgdW5zaWduZWQgaW50ICk+IGZpbmRfbmV4dDsKCWZpbmRfbmV4dCA9IFs9XSggY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5vZGU+IG5vZGVfdG8sIHVuc2lnbmVkIGludCBsZW4gKQoJewogICAgCWZvciAoIGNvbnN0IGF1dG8gcmhzIDogZWRnZXMgKQogICAgCXsgIAogICAgICAgIAlpZiAoICgqbm9kZV90bykgPT0gKCpyaHMuZnJvbSkgKSAKICAgICAgICAJewogICAgICAgICAgICAJbGVuKys7CiAgICAgICAgICAgIAlmaW5kX25leHQgKCByaHMuZnJvbSwgbGVuICk7CiAgICAgICAgCX0KICAgIAl9Cgl9OwoJCglmb3IgKCBjb25zdCBhdXRvIGxocyA6IGVkZ2VzICkKCXsKICAgIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKICAgIAljb25zdCBhdXRvIGZyb20gPSBsaHMudG87CiAgICAJZmluZF9uZXh0ICggZnJvbSwgbGVuICk7Cgl9CgoJcmV0dXJuIDA7Cn0=