|
GDAL
|
00001 /****************************************************************************** 00002 * $Id: gnmgraph.h 36302 2016-11-19 16:54:08Z bishop $ 00003 * 00004 * Project: GDAL/OGR Geography Network support (Geographic Network Model) 00005 * Purpose: GNM graph implementation. 00006 * Authors: Mikhail Gusev (gusevmihs at gmail dot com) 00007 * Dmitry Baryshnikov, polimax@mail.ru 00008 * 00009 ****************************************************************************** 00010 * Copyright (c) 2014, Mikhail Gusev 00011 * Copyright (c) 2014-2015, NextGIS <info@nextgis.com> 00012 * 00013 * Permission is hereby granted, free of charge, to any person obtaining a 00014 * copy of this software and associated documentation files (the "Software"), 00015 * to deal in the Software without restriction, including without limitation 00016 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00017 * and/or sell copies of the Software, and to permit persons to whom the 00018 * Software is furnished to do so, subject to the following conditions: 00019 * 00020 * The above copyright notice and this permission notice shall be included 00021 * in all copies or substantial portions of the Software. 00022 * 00023 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00024 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00025 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00026 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00027 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00028 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00029 * DEALINGS IN THE SOFTWARE. 00030 ****************************************************************************/ 00031 00032 #include "cpl_port.h" 00033 #include <map> 00034 #include <queue> 00035 #include <set> 00036 #include <vector> 00037 00038 // Alias for some big data type to store identificators. 00039 #define GNMGFID GIntBig 00040 // Graph constants 00041 #define GNM_EDGE_DIR_BOTH 0 // bidirectional 00042 #define GNM_EDGE_DIR_SRCTOTGT 1 // from source to target 00043 #define GNM_EDGE_DIR_TGTTOSRC 2 // from target to source 00044 00045 // Types declarations. 00046 typedef std::vector<GNMGFID> GNMVECTOR, *LPGNMVECTOR; 00047 typedef const std::vector<GNMGFID> GNMCONSTVECTOR; 00048 typedef const std::vector<GNMGFID>* LPGNMCONSTVECTOR; 00049 typedef std::pair<GNMGFID,GNMGFID> EDGEVERTEXPAIR; 00050 typedef std::vector< EDGEVERTEXPAIR > GNMPATH; 00051 00053 struct GNMStdEdge 00054 { 00055 GNMGFID nSrcVertexFID; 00056 GNMGFID nTgtVertexFID; 00057 bool bIsBidir; 00058 double dfDirCost; 00059 double dfInvCost; 00060 bool bIsBloked; 00061 }; 00062 00064 struct GNMStdVertex 00065 { 00066 GNMVECTOR anOutEdgeFIDs; 00067 bool bIsBloked; 00068 }; 00069 00083 class CPL_DLL GNMGraph 00084 { 00085 public: 00086 GNMGraph(); 00087 virtual ~GNMGraph(); 00088 00089 // GNMGraph 00090 00099 virtual void AddVertex(GNMGFID nFID); 00100 00105 virtual void DeleteVertex(GNMGFID nFID); 00106 00116 virtual void AddEdge(GNMGFID nConFID, GNMGFID nSrcFID, GNMGFID nTgtFID, 00117 bool bIsBidir, double dfCost, double dfInvCost); 00118 00123 virtual void DeleteEdge(GNMGFID nConFID); 00124 00131 virtual void ChangeEdge(GNMGFID nFID, double dfCost, double dfInvCost); 00132 00138 virtual void ChangeBlockState (GNMGFID nFID, bool bBlock); 00139 00145 virtual bool CheckVertexBlocked(GNMGFID nFID) const; 00146 00154 virtual void ChangeAllBlockState (bool bBlock = false); 00155 00168 virtual GNMPATH DijkstraShortestPath(GNMGFID nStartFID, GNMGFID nEndFID); 00169 00189 virtual std::vector<GNMPATH> KShortestPaths(GNMGFID nStartFID, 00190 GNMGFID nEndFID, size_t nK); 00191 00205 virtual GNMPATH ConnectedComponents(const GNMVECTOR &anEmittersIDs); 00206 00208 virtual void Clear(); 00209 protected: 00226 virtual void DijkstraShortestPathTree(GNMGFID nFID, 00227 const std::map<GNMGFID, GNMStdEdge> &mstEdges, 00228 std::map<GNMGFID, GNMGFID> &mnPathTree); 00230 virtual GNMPATH DijkstraShortestPath(GNMGFID nStartFID, GNMGFID nEndFID, 00231 const std::map<GNMGFID, GNMStdEdge> &mstEdges); 00233 virtual LPGNMCONSTVECTOR GetOutEdges(GNMGFID nFID) const; 00234 virtual GNMGFID GetOppositVertex(GNMGFID nEdgeFID, GNMGFID nVertexFID) const; 00235 virtual void TraceTargets(std::queue<GNMGFID> &vertexQueue, 00236 std::set<GNMGFID> &markedVertIds, 00237 GNMPATH &connectedIds); 00238 protected: 00239 std::map<GNMGFID, GNMStdVertex> m_mstVertices; 00240 std::map<GNMGFID, GNMStdEdge> m_mstEdges; 00242 };
1.7.6.1.