int main() { stress_test(); return 0; int V = 6; vvii AdjList(V, vii()); AdjList[0].push_back(ii(1,5)); AdjList[1].push_back(ii(2,1)); AdjList[1].push_back(ii(3,5)); AdjList[1].push_back(ii(5,3)); AdjList[2].push_back(ii(4,1)); AdjList[3].push_back(ii(4,1)); AdjList[4].push_back(ii(3,2)); AdjList[5].push_back(ii(4,2)); vi dist,dist2; pq::binary_heap pq(V); //pq::fibonacci_heap<ii> pq2; dijkstra(pq, AdjList, dist, V, 0); //dijkstra(pq2, AdjList, dist2, V, 0); std::cout << dist[4] << std::endl; //std::cout << dist2[4] << std::endl; return 0; }
CrsGraph_SymmRCM::NewTypeRef CrsGraph_SymmRCM:: operator()( CrsGraph_SymmRCM::OriginalTypeRef orig ) { origObj_ = &orig; int err; //Generate Local Transpose Graph CrsGraph_Transpose transposeTransform; Epetra_CrsGraph & trans = transposeTransform( orig ); //Generate Local Symmetric Adj. List //Find Min Degree Node While at it int NumNodes = orig.NumMyRows(); int * LocalRow; int * LocalRowTrans; int RowSize, RowSizeTrans; std::vector< std::vector<int> > AdjList( NumNodes ); int MinDegree = NumNodes; int MinDegreeNode; for( int i = 0; i < NumNodes; ++i ) { orig.ExtractMyRowView( i, RowSize, LocalRow ); trans.ExtractMyRowView( i, RowSizeTrans, LocalRowTrans ); std::set<int> adjSet; for( int j = 0; j < RowSize; ++j ) if( LocalRow[j] < NumNodes ) adjSet.insert( LocalRow[j] ); for( int j = 0; j < RowSizeTrans; ++j ) if( LocalRowTrans[j] < NumNodes ) adjSet.insert( LocalRowTrans[j] ); std::set<int>::iterator iterS = adjSet.begin(); std::set<int>::iterator endS = adjSet.end(); AdjList[i].resize( adjSet.size() ); for( int j = 0; iterS != endS; ++iterS, ++j ) AdjList[i][j] = *iterS; if( AdjList[i].size() < MinDegree ) { MinDegree = AdjList[i].size(); MinDegreeNode = i; } } BFT * BestBFT; bool TooWide; //std::cout << "SymmRCM::bruteForce_ : " << bruteForce_ << std::endl; if( bruteForce_ ) { int bestWidth = NumNodes; int bestDepth = 0; for( int i = 0; i < NumNodes; ++i ) { BFT * TestBFT = new BFT( AdjList, i, NumNodes, TooWide ); if( TestBFT->Depth() > bestDepth || ( TestBFT->Depth() == bestDepth && TestBFT->Width() < bestWidth ) ) { BestBFT = TestBFT; bestDepth = TestBFT->Depth(); bestWidth = TestBFT->Width(); } else delete TestBFT; } } else { //Construct BFT for first BestBFT = new BFT( AdjList, MinDegreeNode, NumNodes, TooWide ); int MinWidth = BestBFT->Width(); int BestWidth = MinWidth; int Diameter = BestBFT->Depth(); std::vector<int> Leaves; BestBFT->NonNeighborLeaves( Leaves, AdjList, testLeafWidth_ ); bool DeeperFound; bool NarrowerFound; bool Finished = false; while( !Finished ) { DeeperFound = false; NarrowerFound = false; for( int i = 0; i < Leaves.size(); ++i ) { BFT * TestBFT = new BFT( AdjList, Leaves[i], MinWidth, TooWide ); if( TooWide ) delete TestBFT; else { if( TestBFT->Width() < MinWidth ) MinWidth = TestBFT->Width(); if( TestBFT->Depth() > Diameter ) { delete BestBFT; Diameter = TestBFT->Depth(); BestWidth = TestBFT->Width(); BestBFT = TestBFT; DeeperFound = true; NarrowerFound = false; } else if( (TestBFT->Depth()==Diameter) && (TestBFT->Width()<BestWidth) ) { delete BestBFT; BestWidth = TestBFT->Width(); BestBFT = TestBFT; NarrowerFound = true; } else delete TestBFT; } } if( DeeperFound ) BestBFT->NonNeighborLeaves( Leaves, AdjList, testLeafWidth_ ); else if( NarrowerFound ) Finished = true; else Finished = true; } } //std::cout << "\nSymmRCM:\n"; //std::cout << "----------------------------\n"; //std::cout << " Depth: " << BestBFT->Depth() << std::endl; //std::cout << " Width: " << BestBFT->Width() << std::endl; //std::cout << "----------------------------\n\n"; std::vector<int> RCM; BestBFT->ReverseVector( RCM ); for( int i = 0; i < NumNodes; ++i ) RCM[i] = orig.RowMap().GID( RCM[i] ); //Generate New Row Map RCMMap_ = new Epetra_Map( orig.RowMap().NumGlobalElements(), NumNodes, &RCM[0], orig.RowMap().IndexBase(), orig.RowMap().Comm() ); //Generate New Col Map if( RCMMap_->DistributedGlobal() ) { std::vector<int> colIndices = RCM; const Epetra_BlockMap & origColMap = orig.ColMap(); if( origColMap.NumMyElements() > RCMMap_->NumMyElements() ) { for( int i = RCMMap_->NumMyElements(); i < origColMap.NumMyElements(); ++i ) colIndices.push_back( origColMap.GID(i) ); } RCMColMap_ = new Epetra_Map( orig.ColMap().NumGlobalElements(), colIndices.size(), &colIndices[0], orig.ColMap().IndexBase(), orig.ColMap().Comm() ); } else RCMColMap_ = RCMMap_; //Create New Graph Epetra_Import Importer( *RCMMap_, orig.RowMap() ); Epetra_CrsGraph * RCMGraph = new Epetra_CrsGraph( Copy, *RCMMap_, *RCMColMap_, 0 ); RCMGraph->Import( orig, Importer, Insert ); RCMGraph->FillComplete(); /* std::cout << "origGraph\n"; std::cout << orig; std::cout << "RCMGraph\n"; std::cout << *RCMGraph; */ newObj_ = RCMGraph; return *RCMGraph; }