Ejemplo n.º 1
0
/**
 * \brief Builds a collection of vertices representing a given polygon as a
 *        collection of triangles.
 * \param v The vertices of the polygon to convert.
 */
bear::visual::gl_state::position_vector
bear::visual::gl_state::polygon_to_triangles( const position_vector& v ) const
{
  CLAW_PRECOND( v.size() >= 3 );

  position_vector result;
  result.reserve( 3 * (v.size() - 2) );

  const position_vector::const_iterator root_vertex( v.begin() );
  position_vector::const_iterator first_vertex( root_vertex + 1 );
  position_vector::const_iterator second_vertex( root_vertex + 2 );

  do
    {
      result.push_back( *root_vertex );
      result.push_back( *first_vertex );
      result.push_back( *second_vertex );

      ++first_vertex;
      ++second_vertex;
    }
  while ( second_vertex != v.end() );

  return result;
} // gl_state::polygon_to_triangles()
/*
 * 深度优先搜索遍历图的递归实现
 */
static void DFS(Graph G, int i, int *visited)
{                                   
    int w; 

    visited[i] = 1;
    printf("%c ", G.vexs[i]);
    // 遍历该顶点的所有邻接顶点。若是没有访问过,那么继续往下走
    for (w = first_vertex(G, i); w >= 0; w = next_vertix(G, i, w))
    {
        if (!visited[w])
            DFS(G, w, visited);
    }
       
}
Ejemplo n.º 3
0
int main(int argc, char const* argv[]) {
    if (argc < 2) {
        std::cout << "usage: " << argv[0] << " num_vertices < input\n";
        return EXIT_FAILURE;
    }

    unsigned int num_vertices = boost::lexical_cast<unsigned int>(argv[1]);
    std::istream_iterator<unsigned int> first_vertex(std::cin), last_vertex;
    boost::directed_graph<> graph;
    build_graph(graph, num_vertices, first_vertex, last_vertex);

    cycle_printer<std::ostream> visitor(std::cout);
    boost::hawick_circuits(graph, visitor);

    return EXIT_SUCCESS;
}
/*
 * 广度优先搜索(类似于树的层次遍历)
 */
void BFS(Graph G)
{
    int head = 0;
    int rear = 0;
    int queue[MAX];     // 辅组队列
    int visited[MAX];   // 顶点访问标记
    int i, j, k;

    for (i = 0; i < G.vexnum; i++)
        visited[i] = 0;

    printf("BFS: ");
    for (i = 0; i < G.vexnum; i++)
    {
        if (!visited[i])
        {
            visited[i] = 1;
            printf("%c ", G.vexs[i]);
            queue[rear++] = i;  // 入队列
        }
        while (head != rear) 
        {
            j = queue[head++];  // 出队列
            for (k = first_vertex(G, j); k >= 0; k = next_vertix(G, j, k)) //k是为访问的邻接顶点
            {
                if (!visited[k])
                {
                    visited[k] = 1;
                    printf("%c ", G.vexs[k]);
                    queue[rear++] = k;
                }
            }
        }
    }
    printf("\n");
}
Ejemplo n.º 5
0
static void ant_rlf(gcp_solution_t *sol, gcp_t *problem) {/*{{{*/

	int i, j;
	int colornumber = 0;	/* number of colors used */
	int colored = 0;		/* number of colored vertex */
	int v, new_v;			/* vertex to be colored */
	int nn;					/* keep number of non-neighbors of v */
	double *probb;			/* probabilities for choosing a vertex */
	
/*{{{*/
	static int *degree = NULL;
	static int **adj = NULL;
	static int *ctr = NULL;
	if (!ctr) {
		degree = malloc_(sizeof(int) * problem->size);
		adj = malloc_(sizeof(int*) * problem->size);
	}

	for (i = 0; i < problem->size; i++) {
		degree[i] = problem->degree[i];

		if (!ctr) {
			adj[i] = malloc(sizeof(int) * problem->size);
		}

		for (j = 0; j < problem->size; j++) {
			adj[i][j] = problem->adj[i][j];
//			adj[j][i] = problem->adj[j][i];
		}
	}
	ctr = degree;
/*}}}*/

	while (colored < problem->size) {

		v = first_vertex(degree, problem->size);

		sol->color[v] = colornumber;
        sol->nodes_color[colornumber]++;
		colored++;

		nn = problem->size - degree[v] - 1;
		for (i = 0; i < problem->size; i++) {
			if (!adj[v][i] && (degree[i] == OUT)) {
				nn--;
			}
		}

		while (nn > 0) {
			
            /* choose new_v, non neighbor of v that is not OUT with probability p */
			/*
            probb = calculate_probbs(v, problem->size, colornumber, degree, 
							adj, sol->color, problem->alpha, problem->beta);
	        new_v = choose_vertex(probb, problem->size);
			*/
			new_v = 0;
            while (v==new_v || (degree[new_v]==OUT) || adj[new_v][v]) new_v++;
			for (i = new_v; i < problem->size; i++) {
				if ((i != v) && !adj[v][i] && (degree[i] != OUT) && (degree[i] > degree[new_v]))
					new_v = i;						
			}
			

			sol->color[new_v] = colornumber;
			sol->nodes_color[colornumber]++;
			colored++;

			contract(v, new_v, degree, adj, problem->size, &nn);

			nn--;

		}

		remove_(v, degree, adj, problem->size);
		colornumber++;

	}

	sol->spent_time = current_usertime_secs();
	sol->ncolors = colornumber;

}/*}}}*/