void CriticalPoint::TraceMaxLineFromSaddle(SadPoint& sadP, size_t& maxP, IntArray& pathArray) { /* TraceMaxLineFromSaddle : from a saddle point, find a path to a max point * maxP : sadP.maxPoints* * pathArray : sadP.maxPath* */ CoordArray& vCoord = *(Global::p_coord); size_t nextVID = maxP; pathArray.clear(); pathArray.push_back(sadP.getId()); double lensum = 0; while( ((m_vtx)[nextVID])->getType() != Global::MAXPOINT) { pathArray.push_back(nextVID); double len = (vCoord[pathArray[pathArray.size() - 2]] - vCoord[pathArray[pathArray.size() - 1]]).abs(); lensum += len; if (lensum < Global::maxLineLength) { nextVID = FindMaxEigenValueFromVertexNeigh(nextVID); } else return; } pathArray.push_back(nextVID); maxP = nextVID; }
void Contour::traceContour( double zValue, PointArray& cnpts, IntArray& cnpos, IntArray& dirs ) { // 初始化默认三角形都没有被使用 for( int i = 0; i < ( int )taa.size(); i++ ) { taa[i]->used = false; } // 记录第1个三角形(搜索起点) int t0 = -1, e0 = -1; DT_Point p; while( findStartTrianlgeTwice( zValue, t0, e0, p ) ) { // 添加搜索开始点 PointArray z_cnpts; z_cnpts.push_back( p ); int t1 = t0, e1 = e0, t2, e2; while( findNextTriangle( zValue, t1, e1, t2, e2, p ) ) { t1 = t2; e1 = e2; z_cnpts.push_back( p ); } // 如果只有一个点,表示追踪等值线失败 if( z_cnpts.size() == 1 ) { break; } // 表示闭合等值线方向(1或-1), 开放等值线为0 int dir = 0; // 等值线是否闭合(起始边与结束边在一个三角形内) if( isCoedge( t0, t1, e0 ) ) { getTriangleObject( t1 )->used = true; z_cnpts.push_back( z_cnpts.front() ); // 等值线闭合,结束在一个三角形内,两条边共点 dir = ( ( zValue > pa[getCoNode( e0, e1 )].z ) ? 1 : -1 ); } // 复制计算得到的等值点 std::copy( z_cnpts.begin(), z_cnpts.end(), std::back_inserter( cnpts ) ); // 记录等值线个数 cnpos.push_back( z_cnpts.size() ); // 记录等值线的方向 dirs.push_back( dir ); } }
static BOOL ShowRetDlg() { ResultDlg retDlg; AcStringArray datas; datas.append(_T("目前矿井瓦斯抽采系统正常运转,能保证生产接续")); datas.append(_T("建立了部分部分瓦斯抽采系统,无法保证生产接续")); datas.append(_T("没有建立地面固定瓦斯抽采系统")); datas.append(_T("其他")); retDlg.setItemDatas(datas); IntArray trueIndxs; trueIndxs.push_back(0); trueIndxs.push_back(1); retDlg.setTrueIndex(trueIndxs,RET_GASSYS_OBJCT_NAME,DESC_GASSYS_OBJCT_NAME); AcStringArray bookMks; bookMks.append(_T("GasSys_Ret")); bookMks.append(_T("GasSys_Method")); bookMks.append(_T("GasSys_Conclusion")); bookMks.append(_T("GasSys_YesOrNo")); retDlg.setBookMarks(bookMks); if(IDOK == retDlg.DoModal()) { return TRUE; } else return FALSE; }
bool dfs_all_path(Digraph& dg, ArcFilter& arc_filter, Digraph::Node s, Digraph::Node t, IntArray& pathNums, EdgeArray& allPath) { for(int k=1;k<1000;k++) { //存储搜索的路径 EdgeArray p; //搜索第k路径 //acutPrintf(_T("\nK=%d"),k); if(!mrp_k(dg, arc_filter, s, t, k, p)) { //一旦第k次搜索不成功,后续的搜索同样也会失败! //所以这时候可以直接退出循环了 break; } else { //记录路径的分支个数 pathNums.push_back(p.size()); //将路径复制到allPath数组中 std::copy(p.begin(), p.end(), std::back_inserter(allPath)); } } return (!pathNums.empty()); //return false; }
void testPushPop() { IntArray a; a.push_back(5); a.push_back(6); assert(a[0] == 5 && a[1] == 6); a.pop_back(); assert(a.size() == 1); a.pop_back(); assert(a.size() == 0); }
void KDTree<T>::KDNode::nodeSizes( IntArray &sizes, int idx ) const { while ( idx >= sizes.size() ) { sizes.push_back( 0 ); } sizes[ idx ] = _numElements; if ( _left ) _left->nodeSizes( sizes, 2 * idx + 1 ); if ( _right ) _right->nodeSizes( sizes, 2 * idx + 2 ); }
void CriticalPoint::TraceMinLineFromSaddle(SadPoint& sadP,size_t& minP,IntArray& pathArray) { CoordArray& vCoord = *(Global::p_coord); size_t nextVID = minP; pathArray.push_back(sadP.getId()); double lensum = 0; while (m_vtx[nextVID]->getType() != Global::MINPOINT) { pathArray.push_back(nextVID); double len = (vCoord[pathArray[pathArray.size() - 2]] - vCoord[pathArray[pathArray.size() - 1]]).abs(); lensum += len; if (lensum < Global::maxLineLength) { nextVID = FindMinEigenValueFromVertexNeigh(nextVID); } else return; } pathArray.push_back(nextVID); minP = nextVID; }
//从文件中读取数据,包括拓扑数据, 巷道实际风阻,风量;通风系统总风量 static bool ReadTopologyDatas( std::istream& stream, IntArray& E, IntArray& U, IntArray& V) { /* 读取分支数 */ int n = 0; stream>>n; /* 读取网络拓扑和初始分支风阻 */ for(int i=0;i<n;i++) { int e, u, v; //double r, rmin, rmax; stream >> e >> u >> v; //if(stream.fail()) break; E.push_back(e); U.push_back(u); V.push_back(v); } return true; }
static void ApproximatePolygon( const PointArray& cnpts, PointArray& polygon, double tolerance ) { if( cnpts.empty() ) return; int n = cnpts.size(); // 是否封闭等值线??? if( IsPointEqual( cnpts.front(), cnpts.back() ) ) { n--; } int minEdge = n + 1, k = n; IntArray indexes; for( int i = 0; i < ( int )cnpts.size(); i++ ) { indexes.push_back( i ); } while( k < minEdge ) { minEdge = k; int p = 0; while( p < minEdge - ( n % 2 == 0 ? 3 : 2 ) ) { double distance = GetPointDistanceToLine( cnpts[indexes[p + 1]], cnpts[indexes[p]], cnpts[indexes[p + 2]] ); if ( distance < tolerance ) { indexes[p + 1] = -1; k -= 1; } p += 2; } UpdateIndexes( indexes ); } for( int i = 0; i < ( int )indexes.size(); i++ ) { polygon.push_back( cnpts[indexes[i]] ); } }
//在main()函数中测试fill和fill_n算法 void main () { //-------------------------------------------- // fill和fill_n算法对普通数组的计算 //--------------------------------------------- int x[]={1,3,5,7,9}; cout << "x[]: "; put_array(x,5); //填数处理 fill(x+1,x+3,2); cout << "fill(x+1,x+3,2): "<<endl; put_array(x,5); fill_n(x,3,8); cout << "fill_n(x,3,8): "<<endl; put_array(x,5); //-------------------------------------------- // fill和fill_n算法对于vector容器的计算 //--------------------------------------------- //声明intvector容器和迭代器ii IntArray intvector; //向intvector容器中插入元素 for (int i=1; i<=10; i++) { intvector.push_back(i); }; //显示intvector容器中的元素值和统计结果 cout << "intvector: "<<endl; put_vector(intvector); //填数处理 fill(intvector.begin(),intvector.begin()+3,2); cout << "fill(intvector.begin(),intvector.begin()+3,2): "<<endl; put_vector(intvector); fill_n(&intvector[5],3,8); cout << "fill_n(&intvector[5],3,8): "<<endl; put_vector(intvector); }
Array* Array_readLocalData(Input& fr) { if (fr[0].matchWord("Use")) { if (fr[1].isString()) { Object* obj = fr.getObjectForUniqueID(fr[1].getStr()); if (obj) { fr+=2; return dynamic_cast<Array*>(obj); } } osg::notify(osg::WARN)<<"Warning: invalid uniqueID found in file."<<std::endl; return NULL; } std::string uniqueID; if (fr[0].matchWord("UniqueID") && fr[1].isString()) { uniqueID = fr[1].getStr(); fr += 2; } int entry = fr[0].getNoNestedBrackets(); const char* arrayName = fr[0].getStr(); unsigned int capacity = 0; fr[1].getUInt(capacity); ++fr; fr += 2; Array* return_array = 0; if (strcmp(arrayName,"ByteArray")==0) { ByteArray* array = new ByteArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { int int_value; if (fr[0].getInt(int_value)) { ++fr; array->push_back(int_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"ShortArray")==0) { ShortArray* array = new ShortArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { int int_value; if (fr[0].getInt(int_value)) { ++fr; array->push_back(int_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"IntArray")==0) { IntArray* array = new IntArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { int int_value; if (fr[0].getInt(int_value)) { ++fr; array->push_back(int_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"UByteArray")==0) { UByteArray* array = new UByteArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int uint_value; if (fr[0].getUInt(uint_value)) { ++fr; array->push_back(uint_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"UShortArray")==0) { UShortArray* array = new UShortArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int uint_value; if (fr[0].getUInt(uint_value)) { ++fr; array->push_back(uint_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"UIntArray")==0) { UIntArray* array = new UIntArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int uint_value; if (fr[0].getUInt(uint_value)) { ++fr; array->push_back(uint_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"UVec4bArray")==0 || strcmp(arrayName,"Vec4ubArray")==0) { Vec4ubArray* array = new Vec4ubArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g,b,a; if (fr[0].getUInt(r) && fr[1].getUInt(g) && fr[2].getUInt(b) && fr[3].getUInt(a)) { fr+=4; array->push_back(osg::Vec4ub(r,g,b,a)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"FloatArray")==0) { FloatArray* array = new FloatArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { float float_value; if (fr[0].getFloat(float_value)) { ++fr; array->push_back(float_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"DoubleArray")==0) { DoubleArray* array = new DoubleArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { double double_value; if (fr[0].getFloat(double_value)) { ++fr; array->push_back(double_value); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec2Array")==0) { Vec2Array* array = new Vec2Array; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec2 v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())) { fr += 2; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec2dArray")==0) { Vec2dArray* array = new Vec2dArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec2d v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y())) { fr += 2; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec3Array")==0) { Vec3Array* array = new Vec3Array; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec3 v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z())) { fr += 3; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec3dArray")==0) { Vec3dArray* array = new Vec3dArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec3d v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z())) { fr += 3; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec4Array")==0) { Vec4Array* array = new Vec4Array; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec4 v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w())) { fr += 4; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec4dArray")==0) { Vec4dArray* array = new Vec4dArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { Vec4d v; if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w())) { fr += 4; array->push_back(v); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec2bArray")==0) { Vec2bArray* array = new Vec2bArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g; if (fr[0].getUInt(r) && fr[1].getUInt(g)) { fr+=2; array->push_back(osg::Vec2b(r,g)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec3bArray")==0) { Vec3bArray* array = new Vec3bArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g,b; if (fr[0].getUInt(r) && fr[1].getUInt(g) && fr[2].getUInt(b)) { fr+=3; array->push_back(osg::Vec3b(r,g,b)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec4bArray")==0) { Vec4bArray* array = new Vec4bArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g,b,a; if (fr[0].getUInt(r) && fr[1].getUInt(g) && fr[2].getUInt(b) && fr[3].getUInt(a)) { fr+=4; array->push_back(osg::Vec4b(r,g,b,a)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec2sArray")==0) { Vec2sArray* array = new Vec2sArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g; if (fr[0].getUInt(r) && fr[1].getUInt(g)) { fr+=2; array->push_back(osg::Vec2s(r,g)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec3sArray")==0) { Vec3sArray* array = new Vec3sArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g,b; if (fr[0].getUInt(r) && fr[1].getUInt(g) && fr[2].getUInt(b)) { fr+=3; array->push_back(osg::Vec3s(r,g,b)); } else ++fr; } ++fr; return_array = array; } else if (strcmp(arrayName,"Vec4sArray")==0) { Vec4sArray* array = new Vec4sArray; array->reserve(capacity); while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) { unsigned int r,g,b,a; if (fr[0].getUInt(r) && fr[1].getUInt(g) && fr[2].getUInt(b) && fr[3].getUInt(a)) { fr+=4; array->push_back(osg::Vec4s(r,g,b,a)); } else ++fr; } ++fr; return_array = array; } if (return_array) { if (!uniqueID.empty()) fr.registerUniqueIDForObject(uniqueID.c_str(),return_array); } return return_array; }
////////////////////////////////////////////////////////////////////// // Read a mesh ////////////////////////////////////////////////////////////////////// Mesh *MeshReader::BuildMesh( const string &inputFile ) { // Open the input file ifstream f( inputFile.c_str() ); Real E, v, density; int numGaussPoints; int elementType; int numVertices, numElements, numConstrained; Tuple3i divisions; f >> E; f >> v; f >> density; f >> numGaussPoints; f >> elementType; f >> numVertices; f >> numElements; f >> numConstrained; f >> divisions[ 0 ]; f >> divisions[ 1 ]; f >> divisions[ 2 ]; Vector3Array vertices; for ( int i = 0; i < numVertices; i++ ) { VEC3F p; f >> p[0]; f >> p[1]; f >> p[2]; vertices.push_back( p ); } // Read in elements if ( elementType < 0 || elementType >= Mesh::NUM_ELEMENT_TYPES ) { cout << "Invalid element type!" << endl; return NULL; } IntArray connectivity; if ( elementType == Mesh::ISO_8_NODE ) { for ( int i = 0; i < numElements; i++ ) { for ( int j = 0; j < 8; j++ ) { int nodeNum; f >> nodeNum; connectivity.push_back( nodeNum ); } } } vector<bool> constrained(vertices.size()); for (int i = 0; i < constrained.size(); i++) { constrained.at(i) = false; } // Read in constrained nodes for ( int i = 0; i < numConstrained; i++ ) { int nodeNum; f >> nodeNum; constrained.at(nodeNum) = true; } f.close(); // Finish building the mesh return new Mesh( vertices, (Mesh::ElementType)elementType, connectivity, constrained, E, v, density, numGaussPoints, divisions ); }
void FstLinkedList::initFstLinkedList( string fstPath, string fileName) { listAllFstNodes.clear(); finalFstLinkedList.clear(); string line; StringArray words; ifstream fileIdFile((fstPath + "//" + fileName + ".fst").c_str()); if (!fileIdFile.is_open()) { cout << "FST file missing : " << (fstPath + "//" + fileName + ".fst").c_str() << endl; exit(0); } IntArray lastPhoneArr; while (getline(fileIdFile, line)) { words = Dictionary::string2words(line); FstNode curFstNode; if (words.size() == 5) //FST contains weights { curFstNode.start = atoi(words[0].c_str()); curFstNode.end = atoi(words[1].c_str()); curFstNode.in = words[2]; curFstNode.op = words[3]; curFstNode.wt = AcousticModel::myLog(atof(words[4].c_str())); listAllFstNodes.push_back(curFstNode); // cout <<curFstNode.start << " " << curFstNode.end<<" " << curFstNode.in<<" " << curFstNode.op <<endl; } else if (words.size() == 4) //FST does not contain weights { curFstNode.start = atoi(words[0].c_str()); curFstNode.end = atoi(words[1].c_str()); curFstNode.in = words[2]; curFstNode.op = words[3]; listAllFstNodes.push_back(curFstNode); // cout <<curFstNode.start << " " << curFstNode.end<<" " << curFstNode.in<<" " << curFstNode.op <<endl; } else if (words.size() == 2) // last state has weight { curFstNode.start = atoi(words[0].c_str()); curFstNode.end = -1; curFstNode.wt = atof(words[1].c_str()); listAllFstNodes.push_back(curFstNode); lastPhoneArr.push_back(curFstNode.start); // cout <<curFstNode.start << " " << curFstNode.end<<endl; } else if (words.size() == 1) // last state has no weight { curFstNode.start = atoi(words[0].c_str()); curFstNode.end = -1; listAllFstNodes.push_back(curFstNode); lastPhoneArr.push_back(curFstNode.start); // cout <<curFstNode.start << " " << curFstNode.end<<endl; } else { cout << "ERROR : FST network should not have reached here : " << line << endl; exit(0); } } // cout << listAllFstNodes.size() <<endl; // if the lastPhoneArr points to #0, then make it point the previous phone for (int i = 0; i < (int) listAllFstNodes.size(); i++) { FstNode *curFstNode = &listAllFstNodes[i]; for (int j = 0; j < (int) lastPhoneArr.size(); j++) { if (curFstNode->end == lastPhoneArr[j]) { if (curFstNode->in.compare("#0") == 0) { lastPhoneArr[j] = curFstNode->start; } } } } int currentState = 0; finalFstLinkedList.push_back(listAllFstNodes[0]); for (int i = 1; i < (int) listAllFstNodes.size(); i++) { FstNode *curFstNode = &listAllFstNodes[i]; for (int j = 0; j < (int) lastPhoneArr.size(); j++) { if (curFstNode->end == lastPhoneArr[j]) { curFstNode->lastPhone = 1; if (curFstNode->in.compare("SIL") == 0) { curFstNode->lastSIL = 1; } } } if (curFstNode->start > currentState) { finalFstLinkedList.push_back(*curFstNode); currentState = curFstNode->start; } else { FstNode *endOfLinkedList = &finalFstLinkedList[finalFstLinkedList.size() - 1]; while (endOfLinkedList->nextFstNode != NULL) { endOfLinkedList = endOfLinkedList->nextFstNode; } endOfLinkedList->nextFstNode = curFstNode; } // cout <<curFstNode->start << " " << curFstNode->end<<" " << curFstNode->in<<" " << curFstNode->op << " "<<curFstNode->lastPhone <<" "<<curFstNode->lastSIL <<endl; } }
void Contour::searchBoundary( PointArray& bpts, IntArray& bpos ) { // 记录所有边界分支 BoundaryEdgeArray bea; for( int i = 0; i < ( int )eaa.size(); i++ ) { if( eaa[i]->isBoundary() ) { BoundaryEdge be = {i, false}; bea.push_back( be ); } } if( bea.empty() ) return; // 记录搜索得到的点编号 IntArray pia; // 前提:边界必然是闭合的 // 可能存在多个边界(内外边界) while( true ) { // 搜索可用的边界 int bi = -1; for( int i = 0; i < ( int )bea.size(); i++ ) { BoundaryEdge be = bea[i]; if( !be.used ) { bi = i; break; } } if( bi == -1 ) break; // 记录之前已搜索到的边界点个数 int boundPts_num = pia.size(); DT_Edge e = getEdgeObject( bea[bi].ei )->e; bea[bi].used = true; // 标记为使用 pia.push_back( e.s ); pia.push_back( e.t ); int nt = e.t; while( true ) { int nbi = -1; for( int i = 0; i < ( int )bea.size(); i++ ) { if( bea[i].used ) continue; DT_Edge ne = getEdgeObject( bea[i].ei )->e; if( nt == ne.s ) { nt = ne.t; nbi = i; break; } else if( nt == ne.t ) { nt = ne.s; nbi = i; break; } } if( nbi == -1 ) break; bea[nbi].used = true; pia.push_back( nt ); } int n = pia.size() - boundPts_num; if( n >= 3 ) { // 至少是3个点 bpos.push_back( n ); } } // 将点编号转换成实际的点坐标 for( int i = 0; i < ( int )pia.size(); i++ ) { bpts.push_back( pa[pia[i]] ); } }
//在main()函数中测试find()_end()算法(返回两数组相同元素的在第一个数组中的位置) void main () { //-------------------------------------------- // find_end()算法对普通数组的处理 //--------------------------------------------- int x[ARRAY_SIZE]={1,3,5,7,9,2,4,6,8,10}; cout << "x[]: "; put_array(x,ARRAY_SIZE); cout<<endl; int y[]={5,7,9}; cout << "y[]: "; put_array(y,3); cout<<endl; // find_end()算法查找,并显示查找结果 int *p=find_end(x,x+ARRAY_SIZE,&y[0],&y[2]); if (p != x + ARRAY_SIZE) { //查到 cout << "The first element that matches :" ; put_array(y,3); cout<< " is at location in x" << p - x<< endl; } else { //未查到 cout << "The sequence does not contain any elements"; cout<< " with value " ; put_array(&x[3],3); } //-------------------------------------------- // find_end()算法对vector容器的处理 //--------------------------------------------- //声明intvector容器对象 IntArray intvector; //向intvector容器中插入元素 for (int i=1; i<=10; i++) { intvector.push_back(i); }; //显示intvector容器中的元素值 cout << "intvector: "; put_vector(intvector); cout<<endl; IntArray temp; temp.push_back(5); temp.push_back(6); temp.push_back(7); cout << "temp: "; put_vector(temp); cout<<endl; // find_end()算法查找,并显示查找结果 IntArray::iterator pos; pos=find_end(intvector.begin(),intvector.end(),temp.begin(),temp.end()); if (pos != intvector.end()) { //查到 cout << "The first element that matches "; put_vector(temp); cout<< " is at location in intvector " <<pos - intvector.begin()<< endl; } else { //未查到 cout << "The sequence does not contain any elements"; cout<< " with value "; put_vector(temp); cout<< endl ; } }
int Network::Dinic() { int maxflow = 0; int u,v,e,ee,f; IntArray q; _E.resize(_E.size()+1); _E.back().v = _s; while (true) { for (u = 0;u < _V.size();u++) _V[u].l = -1; _V[_s].l = f = 0; _V[_s].o = _V[_s].e; q.clear(); q.push_back(_s); while (f < (int)q.size()) { u = q[f++]; for (e = _V[u].e;e != -1;e = _E[e].n) { v = _E[e].v; if (_V[v].l == -1 && _E[e].c > 0) { _V[v].o = _V[v].e; _V[v].l = _V[u].l+1; q.push_back(v); } } } if (_V[_t].l == -1) break; q.clear(); q.push_back(_E.size()-1); while (!q.empty()) { u = _E[q.back()].v; if (u == _t) { for (f = INT_MAX,e = 1;e < (int)q.size();e++) if (_E[q[e]].c < f) f = _E[q[e]].c,u = e; for (e = 1;e < q.size();e++) { _E[q[e]].c -= f; _E[q[e]^1].c += f; } maxflow += f; q.resize(u); } else { for (e = _V[u].o;e != -1;e = _E[e].n) { if (_V[_E[e].v].l < 0 || _E[e].c < 1) continue; if (_V[_E[e].v].l == _V[u].l+1) break; } if ((_V[u].o = e) != -1) q.push_back(e); else { q.pop_back(); _V[u].l = -1; } } } } return maxflow; }