Example #1
0
void main()
{
    ReadInput();
    path_vec shortestPath;                                      //最短路径

    int length = Dijkstra(shortestPath);
    paths.push_back(std::make_pair(length,shortestPath));       //找到最短路径

    //PrintPath(shortestPath, length);

    for(unsigned int i=0; i<shortestPath.size()-1; i++)
    {
        path_vec path1;                                         //去掉一条边以后的最短路径

        memcpy(crt_map1, origin_map, sizeof(origin_map));
        RemoveEdge(shortestPath[i], shortestPath[i+1]);         //删除一条边以后找出最短路径
        length = Dijkstra(path1);
        if(length==0)
            continue;
        
        paths.push_back(std::make_pair(length, path1));
        //PrintPath(path1, length);
        for(unsigned int j=0; j<path1.size()-1; j++)
        {
            path_vec path2;                                     //删除第二条边以后的最短路径
            memcpy(crt_map2, crt_map1, sizeof(crt_map1));
            RemoveEdge(path1[j], path1[j+1], crt_map2);
            length = Dijkstra(path2);

            if(length==0)
                continue;
            paths.push_back(std::make_pair(length, path2));
        }
    }

    //将找到的路径排序,然后输出(会存在路径长度相同但是路线不同的路径)
    std::sort(paths.begin(), paths.end(), Compare);

    //删除重复的路径
    RemoveDunplicated(paths);

    int outputCount = 0;
    for(paths_vec_iter iter = paths.begin();
        iter != paths.end();
        iter++)
    {
        if(outputCount++ > K)
            break;
        PrintPath(iter->second, iter->first);
    }
}
Example #2
0
void clGraph::RemoveVertex( int Idx )
{
	size_t Ptr = 0;
	int LastIdx = static_cast<int>( FEdge0.size() ) - 1;

	while ( Ptr < FEdge0.size() )
	{
		if ( FEdge0[Ptr] == Idx || FEdge1[Ptr] == Idx )
		{
			RemoveEdge( Ptr );
		}

		Ptr++;
	}

	FVertices.EraseNoShift( Idx );

	// remap the edges
	for ( size_t P = 0 ; P < FEdge0.size() ; P++ )
	{
		if ( FEdge0[P] == LastIdx ) { FEdge0[P] = Idx; }

		if ( FEdge1[P] == LastIdx ) { FEdge1[P] = Idx; }
	}
}
Example #3
0
void Graph::RemoveNode(GraphNode* node)
{
	size_t count=node->Edges().Count();
	FOR_EACH_SIZE(i, count)
	{
		GraphEdge* edge=node->Edges().Last();
		RemoveEdge(edge);
		delete edge;
	}
void SteerLib::GJK_EPA::FindEars(std::vector<struct triangle>& triangles, std::vector<Util::Vector> shape, std::vector<struct edges> edges)
{
	std::queue<Util::Vector> ears;

	// Get initial ears
	UpdateEars(ears, edges, shape);

	// Loop while there are still more than 3 points in the shape
	while(shape.size() > 3) {
		Util::Vector ear = ears.front();
		Util::Vector n1, n2;
		
		// Get Neighbors of ear
		for (int i = 0; i < edges.size(); i++) {
			if (edges[i].point == ear) {
				n1 = edges[i].neighbor1;
				n2 = edges[i].neighbor2;
				break;
			}
		}

		// Make triangle out of ear and its two neighbors
		struct triangle t = { ear, n1, n2 };
		triangles.push_back(t);

		// Remove edge that has the ear
		// Points that have the ear as its neighbor are neighbored
		RemoveEdge(edges, ear);
		
		// Remove ear from shape
		RemovePoint(shape, ear);

		// Remove ear from queue
		ears.pop();		

		// Update queue since new ears could have been found
		UpdateEars(ears, edges, shape);
	}

	// Add the last three points as a triangle
	struct triangle t = { shape[0], shape[1], shape[2] };
	triangles.push_back(t);

	if (PRINT_TRIANGLES) {
		for (int i = 0; i < triangles.size(); i++) {
			printf("Triangle %d\n", i + 1);
			printf("<%f, %f, %f> - ", triangles[i].p1.x, triangles[i].p1.y, triangles[i].p1.z);
			printf("<%f, %f, %f> - ", triangles[i].p2.x, triangles[i].p2.y, triangles[i].p2.z);
			printf("<%f, %f, %f>\n", triangles[i].p3.x, triangles[i].p3.y, triangles[i].p3.z);
			printf("**************\n");
		}
	}
}
Example #5
0
//----------------------------------------------------------------------------
bool MTMesh::Remove (int label0, int label1, int label2)
{
	TIter iter = mTMap.find(MTITriangle(label0, label1, label2));
	if (iter == mTMap.end())
	{
		// The triangle does not exist.
		return false;
	}
	int t = iter->second;

	MTTriangle& triangle = mTriangles[t];

	// Detach triangle from edges.
	int e0 = triangle.Edge(0);
	int e1 = triangle.Edge(1);
	int e2 = triangle.Edge(2);
	MTEdge& edge0 = mEdges[e0];
	MTEdge& edge1 = mEdges[e1];
	MTEdge& edge2 = mEdges[e2];
	DetachTriangleFromEdge(t, triangle, 0, e0, edge0);
	DetachTriangleFromEdge(t, triangle, 1, e1, edge1);
	DetachTriangleFromEdge(t, triangle, 2, e2, edge2);

	// Detach triangle from vertices.
	int v0 = triangle.Vertex(0);
	MTVertex& vertex0 = mVertices[v0];
	vertex0.RemoveTriangle(t);

	int v1 = triangle.Vertex(1);
	MTVertex& vertex1 = mVertices[v1];
	vertex1.RemoveTriangle(t);

	int v2 = triangle.Vertex(2);
	MTVertex& vertex2 = mVertices[v2];
	vertex2.RemoveTriangle(t);

	// Detach edges from vertices (only if last edge to reference vertex).
	bool e0Destroy = (edge0.Triangle(0) == -1);
	if (e0Destroy)
	{
		vertex0.RemoveEdge(e0);
		vertex1.RemoveEdge(e0);
	}

	bool e1Destroy = (edge1.Triangle(0) == -1);
	if (e1Destroy)
	{
		vertex1.RemoveEdge(e1);
		vertex2.RemoveEdge(e1);
	}

	bool e2Destroy = (edge2.Triangle(0) == -1);
	if (e2Destroy)
	{
		vertex0.RemoveEdge(e2);
		vertex2.RemoveEdge(e2);
	}

	// Removal of components from the sets and maps starts here.  Be careful
	// using set indices, component references, and map iterators since
	// deletion has side effects.  Deletion of a component might cause another
	// component to be moved within the corresponding set or map.
	bool v0Destroy = (vertex0.GetNumEdges() == 0);
	bool v1Destroy = (vertex1.GetNumEdges() == 0);
	bool v2Destroy = (vertex2.GetNumEdges() == 0);

	// Remove edges if no longer used.
	if (e0Destroy)
	{
		RemoveEdge(label0, label1);
	}

	if (e1Destroy)
	{
		RemoveEdge(label1, label2);
	}

	if (e2Destroy)
	{
		RemoveEdge(label2, label0);
	}

	// Remove vertices if no longer used.
	if (v0Destroy)
	{
		RemoveVertex(label0);
	}

	if (v1Destroy)
	{
		RemoveVertex(label1);
	}

	if (v2Destroy)
	{
		RemoveVertex(label2);
	}

	// Remove triangle (definitely no longer used).
	RemoveTriangle(label0, label1, label2);
	return true;
}