예제 #1
0
void findCities(graph<int>& g, LList<int>& cities, int cityId, int p){
	elem_link1<int>* start = g.point(cityId);
	int dist[100];	// 100???
	bool visited[100];	// 100??? - nikoi ne garantira, che id-tata na cities shte sa posledovatelni chisla pod 100
	memset(dist, -1, 100);
	memset(visited, 0, 100);

	if (start){
		visited[start->inf] = true;
		dist[start->inf] = 0;
		queue<int> q;
		q.push(start->inf);
		while (!q.empty()){
			int current = q.front();
			q.pop();
			elem_link1<int>* p = g.point(current);
			p = p->link;
			while (p){
				if (!visited[p->inf]){
					visited[p->inf] = true;
					dist[p->inf] = dist[current] + 1;
					q.push(p->inf);
				}
				p = p->link;
			}

		}

		for (int i = 0; i < 100; i++){
			if (dist[i] >= 0 && dist[i] <= p){
				cities.toEnd(i);
			}
		}
	}
}
void path(town start, graph<town>& g, int p, LList<town> &visited){
	if (g.empty())return;
	int count = 0;
	queue<town> q;
	q.push(start);
	visited.toEnd(start);

	elem_link1<town> * f = g.point(start);
	f = f->link;
	while (!q.empty()){
		town t;
		q.pop(t);

		while (f){
			if (p == count)return;
			else if (!member(visited, f->inf)){

				q.push(f->inf);
				visited.toEnd(f->inf);
				count++;
			}

			f = f->link;
		}
	}
}
예제 #3
0
LList<T> neighbours(graph<T> g, T e) {
  if (!g.top(e)) {
    return LList<T>();
  }

  elem<T> * glist = g.point(e);
  LList<T> neighbours;
  while (glist->link != NULL) {
    neighbours.ToEnd(glist->link->inf);
    glist = glist->link;
  }
  return neighbours;
}
예제 #4
0
LList<int> townLessThan(int start, graph<int> towns, LList<int> &visited, int p)
{
	LList<int> vert = towns.vertexes();
	int n = vert.length();

	//masiv, v koito shte pazim razstoianiata ot s da vs dr grad
	int dist[100];	// Защо 100?
	//inicializirame s -1 (ako niama put si ostava)
	for (int i = 0; i < n; i++)
	{
		dist[i] = -1;
	}

	//BFS
	queue<int> q;
	visited.toEnd(start);
	dist[start] = 0;
	q.push(start);
	while (!q.empty())
	{
		int x;
		q.pop(x);
		elem_link1<int> * p = towns.point(x);
		p = p->link;
		while (p)
		{
			if (!member(p->inf, visited))
			{
				visited.toEnd(p->inf);
				q.push(p->inf);
				dist[x] += 1;	// vsichki stoinosti shte badat 0!
			}
			p = p->link;
		}
	}

	//v masiva dist imame razstoianiata ot start do vs gradove
	LList<int> result;
	for (int i = 0; i < n; i++)
	{
		if (dist[i] <= p && dist[i] != -1)
			result.toEnd(i);
	}
	return result;

}
예제 #5
0
void notFurtherThan(int& dist, int& start, graph<int>& g, LList<int>& visited, LList<int>& cities)
{
	if (contains(visited, cities)) return; // ??? should be contains(visited, start)
	if (dist < 0) return;
	if (!g.top(start)) return;
	visited.ToEnd(start);
	cities.ToEnd(start);
	elem<int>* q = g.point(start);
	q = q->link;

	while (q)
	{
		int distance = dist - 1;
		notFurtherThan(distance, q->inf, g, visited, cities);
		q = q->link;
	}
}