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); } }
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; } } }
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"); } } }
//---------------------------------------------------------------------------- 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; }