罗马尼亚度假问题主体代码
#ifndef NODEEDGE
#define NODEEDGE
extern class cMap;
class cMapEdge;
class cMapNode;
class cMapEdge
{
public:
//边到达的结点的在结点数组中的下标
int m_edgeDesIndex;
double m_edgeWeight;
cMapEdge * m_pEdge;
public:
cMapEdge(int des = -1, double weight = -1, cMapEdge * pEdge = NULL);
cMapEdge(cMapEdge & edge);
cMapEdge & operator =(const cMapEdge& edge);
~cMapEdge(){}
};
class cMapNode
{
friend class Map;
public:
string m_nodeName;
double m_nodeValue;
int m_nodeIndex;
cMapNode * m_pNextNode;
cMapEdge * m_pEdge;
public:
cMapNode(string name = "", double value = -1, int index = -1, cMapEdge * pEdge = NULL, cMapNode * pNext = NULL);
~cMapNode(){}
void AddEdge(int endIndex = -1, double weight = -1);
cMapNode(cMapNode & node);
cMapNode & operator =(const cMapNode & node);
};
#endif
#include "afxfunc.h"
#include "NodeEdge.h"
cMapEdge::cMapEdge(int des, double weight, cMapEdge *pEdge)
{
m_edgeDesIndex = des;
m_edgeWeight = weight;
m_pEdge = pEdge;
}
cMapEdge::cMapEdge(cMapEdge & edge)
{
m_edgeDesIndex = edge.m_edgeDesIndex;
m_edgeWeight = edge.m_edgeWeight;
m_pEdge = edge.m_pEdge;
}
cMapEdge & cMapEdge::operator =(const cMapEdge& edge)
{
m_edgeDesIndex = edge.m_edgeDesIndex;
m_edgeWeight = edge.m_edgeWeight;
m_pEdge = edge.m_pEdge;
return *this;
}
cMapNode::cMapNode(string name, double value, int index, cMapEdge *pEdge, cMapNode *pNext)
{
m_nodeName = name;
m_nodeValue = value;
m_nodeIndex = index;
m_pEdge = pEdge;
m_pNextNode = pNext;
}
void cMapNode::AddEdge(int endIndex, double weight)
{
m_pEdge = new cMapEdge(endIndex, weight, NULL);
}
cMapNode::cMapNode(cMapNode & node)
{
m_nodeIndex = node.m_nodeIndex;
m_nodeName = node.m_nodeName;
m_nodeValue = node.m_nodeValue;
m_pNextNode = node.m_pNextNode;
m_pEdge = node.m_pEdge;
}
cMapNode & cMapNode::operator =(const cMapNode & node)
{
m_nodeIndex = node.m_nodeIndex;
m_nodeName = node.m_nodeName;
m_nodeValue = node.m_nodeValue;
m_pNextNode = node.m_pNextNode;
m_pEdge = node.m_pEdge;
return *this;
}
#ifndef MAP
#define MAP
#include "NodeEdge.h"
struct sNameIndex
{
string m_name;
int m_index;
sNameIndex(string name = "", int index = -1) :m_name(name), m_index(index){}
};
struct sNameIndexDepth
{
string m_name;
int m_index;
int m_depth;
sNameIndexDepth(string name = "", int index = -1,int depth=-1) :m_name(name), m_index(index){}
};
class cMap
{
private:
cMapNode * m_pHeadNode;
int m_size;
cMapNode *m_pCurr;
public:
int COUNT ;
cMap();
~cMap();
void LoadNodeFromFile(string path = "G://C++//SearchPro1//node.txt");
void LoadEdgeFromFile(string path = "G://C++//SearchPro1//edge.txt");
void AddEdge(int endIndex=-1,double weight=-1);
void AddNode(string nodeName="",double nodeValue=-1,int index=-1);
cMapNode* GetNodeByName(string nodeName = "");
cMapNode* GetNodeByIndex(int index = -1);
sNameIndex cMap::GetNodeNamePos(const string nodeName="",const int position=-1);
string BFSearch(string startName = "", string endName = "");
string DLSearch(string startName = "", string endName = "", int depth = 20);
string GSearch(string startName = "", string endName = "");
string ASearch(string startName = "", string endName = "");
string GetPath(sNameIndex * path, int finalIndex = -1);
string GetPathD(sNameIndexDepth * path, int finalIndex = -1);
};
#endif
#include "afxfunc.h"
#include "Map.h"
#include "LinQueue.h"
#include "LinStack.h"
cMap::cMap()
{
COUNT = (0);
m_pCurr = NULL;
m_pHeadNode = NULL;
m_size = 0;
}
cMap::~cMap()
{
}
void cMap::LoadNodeFromFile(string path)
{
string name = "";
double value = -1;
string line;
ifstream ifs;
ifs.open(path);
if (ifs.is_open())
{
cMapNode * p;
cMapNode * q = NULL;
while (!ifs.eof())
{
getline(ifs, line);
int pos = line.find('\t');
name = line.substr(0, pos);
istringstream iss(line.substr(pos +