#include <map>
#include <list>
#include <algorithm>
// Graph nodes are labeled by ints. 
typedef int node;
// For node i, graph[i] is a list of the neighbors of i;
typedef std::map<node, std::list<node> > graph;

void setAdjacent(node i, node j, graph& g) {
	g[i].push_back(j);
	// if the graph is undirected
	g[j].push_back(i);
}

bool isMember(node i, std::list<node> L) {	
	return std::find(L.begin(), L.end(), i) != L.end();
}

bool areAdjacent(node i, node j, graph g) {
	return isMember(i, g[j]);
}

#include <iostream>
void write(std::ostream& out, const std::list<node> L){
	std::list<node>::const_iterator p;
	bool first_time = true;
	out << "[";
	for (p = L.begin(); p != L.end(); ++p) {
		if (first_time) first_time = false;
		else out << ", "; 
		out << *p;
	}
	out << "]";
}

void write(std::ostream& out, const graph g){
	graph::const_iterator p;
	for (p = g.begin(); p != g.end(); ++p) {
		out << p->first << ": ";
		write(out, p->second);
		out << std::endl;
	}
}
