Beispiel #1
0
std::vector<double> spGraph::sssp ( int node ){
    std::vector<double> paths(this->nodeMatrix.size());
    std::vector<int> connections, unvisited(this->nodeMatrix.size());
    int i, cur_node;
    for ( i = 0; i < paths.size(); i++ ){
        paths[i] = DBL_MAX;
        unvisited[i] = 1;
    }
    paths[node] = 0;
    
    cur_node = node;
    
    while ( !all0(unvisited) ){
        connections = this->getConnections(cur_node);
        for ( i = 0; i < connections.size(); i++ ){
            if ( unvisited[connections[i]] ){
                paths[connections[i]] = min(this->getEdge( cur_node, connections[i] ) + paths[cur_node],
                                            paths[connections[i]]);
            }
        }
        unvisited[cur_node] = 0;
        cur_node = this->minUnvisited( paths, unvisited );
    }
    
    return paths;
}
int bftraversal(struct graph *g)
{
  int i;
  struct enode *e;
  struct vnode *v;
  int ndx;
  int level;

  if( (f = init_fifo(g->sz)) == NULL)
  {
    perror("bfttraversal: fifo Malloc error");
    return(-1);
  }
  
  //Reset all visited fields to 0
  for( i = 0; i < g->sz; i++)
    g->vn[i].visited = 0;
  
  i = 0;
  printf("\n");
  while(i != -1)
  {
    g->vn[i].visited = 1;
    level = 1;
    insert_fifo(i,&f);

    while(f->sz > 0)
    {
      extract_fifo(&ndx,f);
      v = &(g->vn[ndx]);
      printf("%d(%d)  ", v->item, v->visited);
      level = v->visited + 1;
      e = v->edge;
      
      while( e != NULL)
      {
        if( !g->vn[e->vndx].visited)
        {
          g->vn[e->vndx].visited = level;
          insert_fifo(e->vndx,&f);
        }
        e = e->next;
      }
      
    }
    i = unvisited(g);
    printf("\n");
  }
  free(f);
  return(0);
}
void dftraversal(struct graph *g)
{
  int i;

  for( i = 0; i < g->sz; i++)
    g->vn[i].visited = 0;
  i = 0;
  printf("\n");
  while( i != -1)
  {
    printf("%d", g->vn[i].item);
    dft(g, &(g->vn[i]), INCR(g->vn[i].item));
    i = unvisited(g);
  }
}
Beispiel #4
0
void sortFree()

{
	unsigned char adj = adjC(CT);
	unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0);		//wont work for empty node
	unsigned char nxTerm = 0;
	if (visited[CT] == 0)
		termPick();
	counter();
	pickup(0);
	pickup(1);
	if (farCount == 2)
	{
		nxTerm = indi[arm[0]];
		//SchDropAtSort(nxTerm);
	}
	else if (adjCount == 1)
	{
		if (farCount == 1)
		{
			nxTerm = adj;
			//SchDropAtSort(nxTerm);
		}
		else	//1 empty block
		{
			nxTerm = adj;
		}
	}
	else if (farCount == 1)
	{
		if (adjCount == 1)
		{
			nxTerm = adj;
			//SchDropAtSort(nxTerm);
		}
		else	//1 empty block
		{
			if (visited[adj] == 0)
			{
				nxTerm = adj;
				//SchDropAtSort(nxTerm);
			}
			else
				nxTerm = indi[arm[pFar]];

		}
	}
	else if (adjCount == 2)
	{
		nxTerm = adj;
		//SchDropAtSort(nxTerm);
	}
	else	//empty term
	{
		if (visited[1] + visited[2] + visited[3] + visited[4] >= 3 && checkForCompletion() >= 6)
		{
			if (nxTerm == 0 && swap[0] == 0 && swap[1] == 0 && arm[0] == 0 && arm[1] == 0)	//panic or complete
				while (1);
		}
		else
		{
			if (visited[adj] == 0)
				nxTerm = adj;
			else
			{
				if (arm[0] > 0)
					nxTerm = indi[arm[0]];
				else if (arm[1] > 0)
					nxTerm = indi[arm[1]];
				else if (swap[CT % 2]>0)
					nxTerm = indi[swap[CT % 2]];
				else if (swap[(CT + 1) % 2] > 0)
					nxTerm = indi[swap[(CT + 1) % 2]];

				else
					nxTerm = unvisited();
			}

		}
		if (nxTerm == 0)
		{
			while (1);
		}
	}
	if (arm[0] == 0 && arm[1] == 0)
	{
		travel(nxTerm);
		sortFree();
	}
	else
	{
		travel(nxTerm);
		sortMan();
	}
}
Beispiel #5
0
void sortMan()
{
	unsigned char nxTerm = 0;
	unsigned char adj = adjC(CT);
	if (visited[CT] == 0)
		termPick();
	counter();
	unsigned char pSwap = ((CT == 2 || CT == 3) ? 1 : 0);
	unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0);		//wont work for empty node
	if (indi[swap[CT % 2]] == CT)
	{
		if (farCount == 2)
		{
			if (term[CT][0] == term[CT][1])
			{
				nxTerm = indi[term[CT][0]]; //the common terminal
				pickup(0);
				drop(0);
				gotoSort();
				pickupS(1);
				dropS(0);
				goBack();
				pickup(1);
				drop(1);
			}
			else	//both diff of far
			{
				nxTerm = indi[term[CT][0]];
				pickup(0);
				drop(0);
				gotoSort();
				pickupS(0);
				dropS(1);
				goBack();
				pickup(1);
				drop(1);
				//SchPickupAtSort	//CT
				//SchDropAtSort		//far
			}
		}
		else if (farCount == 1)
		{
			if (adjCount == 1)
			{
				nxTerm = adj;
				pickup(pFar);
				drop(pFar);
				gotoSort();
				pickupS(pSwap);
				dropS(pSwap);
				goBack();
				pickup(!pFar);
				drop(!pFar);
				//nothing to schedule
			}
			else
			{	//empty node
				//:O :O
				if (visited[adj] == 0 || term[adj][0] != indi[adj] || term[adj][1] != indi[adj])
					nxTerm = adj;

				else	//seq also usable for both empty
				{
					nxTerm = indi[term[CT][pFar]];
					pickup(pFar);
					drop(pFar);
					gotoSort();
					pickupS(pSwap);
					goBack();
					drop(!pFar);
				}
			}
		}
		else if (adjCount == 1)
		{
			if (farCount == 1)
			{
				nxTerm = adj;
				pickup(pFar);
				drop(pFar);
				gotoSort();
				pickupS(pSwap);
				dropS(pSwap);
				goBack();
				pickup(!pFar);
				drop(!pFar);
				//nothing to schedule
			}
			else
			{
				//empty node
				drop(pFar);
				gotoSort();
				pickupS(pSwap);
				goBack();
				pickup(!pFar);
				drop(!pFar);
				nxTerm = adj;
			}
		}
		else if (adjCount == 2)
		{
			nxTerm = adj;
			pickup(0);
			drop(0);
			gotoSort();
			pickupS(pSwap);
			dropS(pSwap);
			goBack();
			pickup(1);
			drop(1);
		}
		if (arm[0] == 0 && arm[1] == 0)
		{
			travel(nxTerm);
			sortFree();
		}
		else
		{
			travel(nxTerm);
			sortMan();
		}

	}


	else if (indi[swap[CT % 2]] != CT)	//Sort can be empty
	{
		if (farCount == 2)
		{
			if (term[CT][0] == term[CT][1])	//and sort not empty why ?? :/
			{
				nxTerm = indi[term[CT][0]]; //the common terminal
				//SchPickupAtSort
				//SchDropAtSort
				pickup(0);
				drop(0);
				pickup(1);
				drop(1);
			}
			else if (swap[CT % 2] == term[CT][0])
			{
				pickup(0);
				drop(0);
				nxTerm = indi[arm[0]];
			}
			else if (swap[CT % 2] == term[CT][1])
			{
				pickup(1);
				drop(1);
				nxTerm = indi[arm[1]];
			}
			else
			{
				if (visited[indi[term[CT][0]]] == 1)
				{
					nxTerm = indi[term[CT][0]];
				}
				else
					nxTerm = indi[term[CT][1]];
				pickup(0);
				drop(0);
				pickup(1);
			}

		}
		else if (farCount == 1)
		{
			if (adjCount == 1)
			{
				if (swap[CT % 2] == 0)
				{
					pickup(!pFar); //adjwala
					drop(!pFar);
					pickup(pFar);
					nxTerm = adj;
					//SchDropAtSort
				}
				else
				{
					//Sort of far and CT has 1 far a adj
					pickup(!pFar);
					drop(!pFar);
					pickup(pFar);
					nxTerm = adj;
				}
			}
			else  //====
			{	//one node is empty
				if (visited[adj] == 1)
					nxTerm = indi[term[CT][pFar]];
				else nxTerm = adj;
				pickup(pFar);
				drop(pFar);
				//SchDropAtSort
			}
		}

		else if (adjCount == 1)
		{
			if (farCount == 1)
			{
				if (swap[CT % 2] == 0)
				{
					pickup(!pFar); //adjwala
					drop(!pFar);
					pickup(pFar);
					nxTerm = adj;
					//SchDropAtSort
				}
				else
				{
					//Sort of far and CT has 1 far a adj
					pickup(!pFar);
					drop(!pFar);
					nxTerm = adj;
				}
			}
			else	//1 empty 1 adj
			{
				pickup(!pFar);
				drop(!pFar);
				nxTerm = adj;
			}
		}
		else if (adjCount == 2)
		{
			if (swap[CT % 2] > 0) //smthin is at Sort
			{
				pickup(0);
				drop(0);
			}
			else
			{
				pickup(0);
				drop(0);
				pickup(1);
			}
			nxTerm = adj;
		}
		else	//empty term nore precisely we arent pickiing up anything so we have NO CLUE WHERE TO GO
		{
			drop(0);
			drop(1);
			if (visited[1] + visited[2] + visited[3] + visited[4] > 3 && checkForCompletion() >= 6)
			{
				if (nxTerm == 0 && swap[0] == 0 && swap[1] == 0 && arm[0] == 0 && arm[1] == 0)	//panic or complete
					while (1);
			}
			else
			{
				if (visited[adj] == 0)
					nxTerm = adj;
				else
				{
					if (arm[0] > 0)
						nxTerm = indi[arm[0]];
					else if (arm[1] > 0)
						nxTerm = indi[arm[1]];
					else if (swap[CT % 2]>0)
						nxTerm = indi[swap[CT % 2]];
					else if (swap[(CT + 1) % 2] > 0)
						nxTerm = indi[swap[(CT + 1) % 2]];

					else
						nxTerm = unvisited();
				}

			}
			if (nxTerm == 0)
			{
				while (1);
			}
		}
	}
	if (arm[0] == 0 && arm[1] == 0)
	{
		travel(nxTerm);
		sortFree();
	}
	else
	{
		travel(nxTerm);
		sortMan();
	}
}
Beispiel #6
0
void sortFree()
{
	unsigned char adj = adjC(CT);
	unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0);		//wont work for empty node
	unsigned char nxTerm = 0;
	if (visited[CT] == 0)
		termPick();
	counter();
	pickup(0);
	pickup(1);
	if (farCount == 2)
	{
		nxTerm = indi[arm[0]];
		//SchDropAtSort(nxTerm);
	}
	else if (adjCount == 1)
	{
		if (farCount == 1)
		{
			nxTerm = adj;
			//SchDropAtSort(nxTerm);
		}
		else	//1 empty block
		{
			nxTerm = adj;
		}
	}
	else if (farCount == 1)
	{
		if (adjCount == 1)
		{
			nxTerm = adj;
			//SchDropAtSort(nxTerm);
		}
		else	//1 empty block
		{
			if (visited[adj] == 0)
			{
				nxTerm = adj;
				//SchDropAtSort(nxTerm);
			}
			else
				nxTerm = indi[arm[pFar]];

		}
	}
	else if (adjCount == 2)
	{
		nxTerm = adj;
		//SchDropAtSort(nxTerm);
	}
	else	//empty term
	{
		if (visited[adj] == 0)
			nxTerm = adj;
		else
			nxTerm = unvisited();
		if (nxTerm == 0)	//panic or complete
			return;
	}
	if (arm[0] == 0 && arm[1] == 0)
	{
		travel(nxTerm);
		sortFree();
	}
	else
	{
		travel(nxTerm);
		sortMan();
	}
}
Beispiel #7
0
 vector<vector<int>> permute(vector<int>& nums) {
 	deque<int> unvisited(nums.begin(), nums.end());
 	vector<int> path;
 	genPerms(unvisited, path);
     return ret;
 }