#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
using namespace std;
struct Edge
{
Edge() {}
Edge(int o) : origin(o) {}
int origin;
};
struct WikiPage
{
WikiPage() {}
WikiPage(const string& t) : title(t) {}
string title;
};
typedef vector<list<Edge> > adjacencyList;
typedef map<int,WikiPage> idToWikiMap;
struct Local {
Local(idToWikiMap mymap) { this->mymap = mymap; }
bool operator() (const list<Edge>& l1, const list<Edge>& l2)
{ return mymap.at(l1.front().origin).title < mymap.at(l2.front().origin).title; }
idToWikiMap mymap;
};
void printOrganized(adjacencyList& lst, idToWikiMap page_ofID) {
// Define compare functions that accepts idToWikiMap parameter
/* Sort adjacenyList lst */
sort (lst.begin()+1, lst.end(), Local(page_ofID));
for(adjacencyList::const_iterator iter = lst.begin(); iter != lst.end(); ++iter)
cout << page_ofID.at(iter->front().origin).title << endl;
}
int main() {
adjacencyList lst;
lst.resize(5);
lst[0].push_back(Edge(-1));
lst[1].push_back(Edge(5));
lst[2].push_back(Edge(7));
lst[3].push_back(Edge(2));
lst[4].push_back(Edge(1));
idToWikiMap page_ofID;
page_ofID[-1] = WikiPage("Unused");
page_ofID[5] = WikiPage("Toronto");
page_ofID[7] = WikiPage("Chicago");
page_ofID[2] = WikiPage("New York");
page_ofID[1] = WikiPage("Montana");
printOrganized(lst, page_ofID);
return 0;
}