//a
void map(LList<town>& l, LList<connections>& c){
	graph<town> g;
	l.iterStart();
	elem_link1<town>*p = l.iter();
	while (p->link){
		g.addTop(p->inf);
	}

	c.iterStart();
	elem_link1<connections>*q = c.iter();
	while (q->link){
		g.addRib(town(q->inf.id1),town( q->inf.id2));
		g.addRib(town(q->inf.id2),town( q->inf.id1));
	}

}
void deleteCity(LList<int>& cities, int id){
	cities.iterStart();
	elem_link1<int>* p = cities.iter();
	while ((p != NULL) && p->inf != id) p = p->link;
	int temp;
	cities.deleteElem(p, temp);
}
int getSites(int id, LList<City>& cities){
	cities.iterStart();

	elem_link1<City>* p = cities.iter();
	while (p){
		if (p->inf.id == id) return p->inf.numSites;
		p = p->link;
	}
	return 0;
}
bool member(LList<town>&L, town t){
	L.iterStart();
	elem_link1<town> * p = L.iter();
	while (p->link){
		if (p->inf.name = t.name)
			return true;
		p = p->link;
	}
	return false;
}
//1v да се намерят първите k града записани в списъка, намерен в б), с най-много забележителности
//около тях, подредени по брой на забележителностите.
//namira br zabelejitelnosti po dadeno ID
int findCount(LList<town> zabelejitelnosti, int ID)
{
	zabelejitelnosti.iterStart();
	elem_link1<town> * p = zabelejitelnosti.iter();
	while (p)
	{
		if (p->inf.id == ID) return p->inf.count;
		p = p->link;
	}
	return 0;
}
bool member(int x, LList <int> l)
{
	l.iterStart();
	elem_link1<int> * p = l.iter();
	while (p)
	{
		if (x == p->inf) return true;
		p = p->link;
	}
	return false;
}
LList<int> zad(int k, LList<int> towns, LList<town> zabelejitelnosti)
{
	LList<int> result;
	towns.iterStart();
	elem_link1<int> * p = towns.iter();
	elem_link1<int> * mp; //pointer to max
	while (p)
	{
		int max = p->inf;
		mp = p;
		elem_link1<int> * q = p->link;
		while (q)
		{
			//namirame broi zabelejitelnosti na stoinostta na p
			int pzab = findCount(zabelejitelnosti, p->inf);
			//namirame broi zabelejitelnost na stoinostta na q
			int qzab = findCount(zabelejitelnosti, q->inf);
			if (pzab < qzab)
			{
				max = q->inf;
				mp = q;
			}
			q = q->link;
		}
		mp->inf = p->inf;
		p->inf = max;
		p = p->link;
	}

	//v towns imame sortirani gradovete po broi zabelejitelnosti
	towns.iterStart();
	elem_link1<int> * m = towns.iter();
	for (int i = 0; i < k; i++)
	{
		if (!m) break;
		result.toEnd(m->inf);
		m = m->link;
	}
	return result;
}
//Подточка в)
LList<int> firstKTowns(LList<City> cities, LList<int> filteredCitiesByDistance, int k)
{
	int currentCities = 0; // not used ???
	int MaxNumberOfFamousPlaces = 0;	// not used ???
	int CurrNumbOfFamousPlaces = 0; // not used ???
	int* arr = new arr[filteredCitiesByDistance.len()]; // ???
	int i = 0;
	cities.IterStart();
	LList<int> temp;
	elem<City>* e = cities.Iter();
	City a;
	while (e)
	{
		filteredCitiesByDistance.IterStart();
		elem<int>* p = filteredCitiesByDistance.Iter();
		while (p)
		{
			a = e->inf;
			if (a.ID == p->inf)
			{
				arr[i] = a.FamousPlaces;
				i++;
			}
			p = p->link;
		}
		e = e->link;
	}

	for (size_t j = 0; j < filteredCitiesByDistance.len(); j++)
	{
		for (size_t p = 0; p < filteredCitiesByDistance.len() - 1; p++)
		{
			if (arr[j] < arr[p + 1]) swap(arr[j], arr[p + 1]);
		}
	}

	for (size_t q = 0; q < k; q++)
	{
		cities.iterStart();
		elem<City>* p = cities.Iter();
		while (p)
		{
			City b = p->inf;
			if (arr[q] == b.FamousPlaces)
			{
				temp.ToEnd(b.ID);
			}
		}
	}
	delete[]arr;
	return temp;
}
int getMaxCity(LList<int>& cities, LList<City>& all){
	cities.iterStart();
	elem_link1<int>* p = cities.iter();
	int max = p->inf;
	p = p->link;
	while (p){
		if (getSites(p->inf, all) > getSites(max, all)){
			max = p->inf;
		}
		p = p->link;
	}

	return max;
}
//1a преобразуват текущото представяне на графа до списък от наследници;
void recreate(LList<rib> ribs) // Трябва да се добавят върховете от towns!
{
	graph<int> g;
	ribs.iterStart();
	elem_link1<rib>* p = ribs.iter();
	while (p)
	{
		if (!g.top(p->inf.start)) g.addTop(p->inf.start);
		if (!g.top(p->inf.end)) g.addTop(p->inf.end);
		if (!g.rib(p->inf.start, p->inf.end)) g.addRib(p->inf.start, p->inf.end);
		if (!g.rib(p->inf.end, p->inf.start)) g.addRib(p->inf.end, p->inf.start);

		p = ribs.iter();
	}
	// return g
}
//v
void firstk(LList<town> &visited, LList<town>& firstk, int k){
	visited.iterStart();
	elem_link1<town> * p = visited.iter();
	int count = 0;
	while (p){
		town max(0, 0);
		max.sites = p->inf.sites;
		while (count != k){
			elem_link1<town>*q = p->link;

			while (q){
				if (max.sites < q->inf.sites)
					max.sites = q->inf.sites;
				q = q->link;
			}
			count++;
			firstk.toEnd(p->inf);
			p = p->link;
		}
	}
}