// © Copyright 1997. Joseph Bergin. All rights reserved.#ifndef Graph_H#define Graph_h#include <pair.h>#include "vector.h"template <class T>class GraphNode{	public:			T value;	private:		int _index;		GraphNode(const T&t = T()):value(t), _index(-1){}		GraphNode(const T&t, int index):value(t), _index(index){}	friend class DiGraph<T>;//	friend ostream& operator<<(ostream&, const GraphNode<T>&);	friend class  pair<GraphNode<T>, vector<int> >; // To initialize an array.};template <class T>ostream& operator<<(ostream& os, const GraphNode<T>& gn){	os << gn.value;	return os;}template <class T>class DiGraph{	public:		typedef vector< pair<GraphNode<T>, vector<int> > >::iterator iterator;				DiGraph():_vertices(){}				GraphNode<T> & newGraphNode(const T& t)		{	_vertices.push_back				(	pair <GraphNode<T>, vector<int> >					(	GraphNode<T>(t, _vertices.size()), vector<int>() 					) 				);			return _vertices.back().first;		}				void arc(const GraphNode<T>& from, const GraphNode<T>& to)		{	_vertices[from._index].second.push_back(to._index);		}		iterator begin(){ return _vertices.begin();}		iterator end (){ return _vertices.end();}			private:		vector< pair<GraphNode<T>, vector<int> > > _vertices;		};#endif