作者:
Phinecos(洞庭散人) 來源:
博客園 發布時間: 2008-08-16 22:25 閱讀: 766 次 推薦: 0
原文鏈接 [收藏]
const int MAXSIZE = 50; //頂點最大數目
#include <vector>
using namespace std;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
class CGraph
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
CGraph(void);
~CGraph(void);
private:
vector<T> vecNodes;//頂點列表
int edge[MAXSIZE][MAXSIZE];//邊表
int numVertexs;//頂點數
int numEdges;//邊數
bool visited[MAXSIZE];//用于圖的遍歷
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int FindVertex(const T& vertex,const vector<T> &lst);
void ClearVisitFlag();
vector<T>& GraphDepthFirstSearch(const T& beginVertex);//深度遍歷圖
vector<T>& GraphBreadthFirstSearch();//廣度遍歷
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public:
bool GraphEmpty(void)const;
bool GraphFull(void)const;
int NumberOfVertices(void)const;//獲取頂點數
int NumberOfEdges(void)const;//獲取邊數
int GetWeight(const T&vertex1,const T& vertex2);//獲取指定兩個頂點間的權值
vector<T>& GetNeighbors(const T& vertex);//獲取指定頂點的鄰接頂點
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
void CreateGraph();//創建圖
int GetVertexPos(const T& vertex);//獲取指定頂點的位置
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int InsertVertex(const T& vertex);//插入頂點
void InsertEdge(const T& vertex1,const T& vertex2,int weight);//插入邊
void DeleteVertex(const T& vertex);//刪除頂點
void DeleteEdge(const T& vertex1,const T& vertex2);//刪除邊
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//int MinimumPath(const T& sVertex,const T& desVertex);最短路徑
void DepthFirstSearch();//深度遍歷圖
void BreadthFirstSearch();//廣度遍歷圖
};
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&width=11&height=16)
圖的實現代碼
#include "Graph.h"
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using namespace std;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
CGraph<T>::CGraph(void)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
for (int i=0;i<MAXSIZE;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for (int j=0;j<MAXSIZE;++j)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->edge[i][j] = 0;
}
}
this->numVertexs = 0;
this->numEdges = 0;
}
template<typename T>
CGraph<T>::~CGraph(void)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
this->vecNodes.clear();
for (int i=0;i<MAXSIZE;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for (int j=0;j<MAXSIZE;++j)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->edge[i][j] = 0;
}
}
this->numVertexs = 0;
this->numEdges = 0;
}
template<typename T>
int CGraph<T>::NumberOfEdges()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return this->numEdges;
}
template<typename T>
int CGraph<T>::NumberOfVertices()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return this->numVertexs;
}
template<typename T>
int CGraph<T>::GetWeight(const T&vertex1,const T& vertex2)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int pos1,pos2;
pos1 = this->GetVertexPos(vertex1);
pos2 = this->GetVertexPos(vertex2);
return this->edge[pos1][pos2];
}
template<typename T>
bool CGraph<T>::GraphFull()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return this->numVertexs>=MAXSIZE;
}
template<typename T>
bool CGraph<T>::GraphEmpty()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return this->numVertexs==0;
}
template<typename T>
int CGraph<T>::InsertVertex(const T& vertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//插入頂點,返回插入位置
int result=-1;
if (!this->GraphFull())
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->vecNodes.push_back(vertex);
result = this->numVertexs;
this->numVertexs++;
}
}
template<typename T>
void CGraph<T>::InsertEdge(const T& vertex1,const T& vertex2,int weight)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//插入邊
int pos1,pos2;
pos1 = this->GetVertexPos(vertex1);
pos2 = this->GetVertexPos(vertex2);
if (pos1==-1&&pos2==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//兩個都是新頂點
pos1 = this->InsertVertex(vertex1);
pos2 = this->InsertVertex(vertex2);
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
else if (pos1==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//一個是新頂點
pos1 = this->InsertVertex(vertex1);
}
else if (pos2==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
pos2 = this->InsertVertex(vertex2);
}
this->edge[pos1][pos2] = weight;
this->edge[pos2][pos1] = weight;
}
template<typename T>
void CGraph<T>::DeleteVertex(const T& vertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//刪除頂點
int pos = this->GetVertexPos(vertex);
if (pos!=-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->vecNodes.erase(remove(this->vecNodes.begin(),this->vecNodes.end(),vertex),this->vecNodes.end());//刪除頂點
for (int i=0;i<this->numVertexs;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(this->edge[pos][i]>0)
this->edge[pos][i] = 0;
if (this->edge[i][pos]>0)
this->edge[i][pos] = 0;
}
this->numVertexs--;
this->numEdges--;
}
}
template<typename T>
void CGraph<T>::DeleteEdge(const T& vertex1,const T& vertex2)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//刪除邊
int pos1,pos2;
pos1 = this->GetVertexPos(vertex1);
pos2 = this->GetVertexPos(vertex2);
if (pos1!=-1&&pos2!=-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (this->edge[pos1][pos2]>0)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->edge[pos1][pos2] = 0;
this->edge[pos2][pos1] = 0;
this->numEdges--;
}
}
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
void CGraph<T>::CreateGraph()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//創建圖
cout<<"輸入頂點數,邊數: ";
cin>>this->numVertexs;
cin>>this->numEdges;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int i;
T item;
cout<<"輸入頂點: ";
for (i=0;i<this->numVertexs;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<"第"<<i+1<<"個頂點: ";
cin>>item;
this->vecNodes.push_back(item);
}
T vert1,vert2;
int pos1,pos2,weight;
for (i=0;i<this->numEdges;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<"輸入第"<<i+1<<"條邊(尾,頭,權值): ";
cin>>vert1>>vert2>>weight;
pos1 = this->GetVertexPos(vert1);
pos2 = this->GetVertexPos(vert2);
this->edge[pos1][pos2] = weight;
this->edge[pos2][pos1] = weight;
}
}
template<typename T>
int CGraph<T>::GetVertexPos(const T& vertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//獲取頂點位置
return this->FindVertex(vertex,this->vecNodes);
}
template<typename T>
int CGraph<T>::FindVertex(const T &vertex,const vector<T> &lst)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//在頂點列表中找指定數據的下標
int pos = -1;
for (pos = lst.size()-1;pos>=0;--pos)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (lst[pos]==vertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
break;
}
}
return pos;
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
vector<T>& CGraph<T>::GraphDepthFirstSearch(const T& beginVertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//深度遍歷
vector<T> *result = new vector<T>();
vector<T> adjLst;
stack<T> s;
s.push(beginVertex);
int pos;
T vertex;
vector<T>::iterator iter;
while (!s.empty())
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
vertex = s.top();
s.pop();
if (this->FindVertex(vertex,*result)==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
pos = this->GetVertexPos(vertex);
visited[pos] = true;
(*result).push_back(vertex);
adjLst = this->GetNeighbors(vertex);
for ( iter= adjLst.begin();iter != adjLst.end();++iter)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (this->FindVertex(*iter,*result)==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
s.push(*iter);
}
}
}
}
return *result;
}
template<typename T>
void CGraph<T>::ClearVisitFlag()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
for (int i=0;i<this->numEdges;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->visited[i] = false;
}
}
template<typename T>
void CGraph<T>::BreadthFirstSearch()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
vector<T>::const_iterator iter;
vector<int> vec;
this->ClearVisitFlag();
vec = this->GraphBreadthFirstSearch();
for (iter = vec.begin();iter!=vec.end();++iter)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<*iter<<" ";
}
this->ClearVisitFlag();
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
vector<T>& CGraph<T>::GraphBreadthFirstSearch()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//廣度遍歷
vector<T> *result = new vector<T>();
vector<T> adjLst;
vector<T>::iterator iter;
queue<T> q;
T item;
int pos;
this->ClearVisitFlag();
for (int i=0;i<this->numVertexs;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!this->visited[i])
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
visited[i] = true;
result->push_back(this->vecNodes[i]);
q.push(this->vecNodes[i]);
while (!q.empty())
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
item = q.front();
q.pop();
adjLst = this->GetNeighbors(item);
for ( iter= adjLst.begin();iter != adjLst.end();++iter)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (this->FindVertex(*iter,*result)==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
result->push_back(*iter);
pos = this->GetVertexPos(*iter);
visited[pos] = true;
}
}
}
}
}
return *result;
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
vector<T>& CGraph<T>::GetNeighbors(const T& vertex)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//獲取鄰接頂點
vector<T> *result;
result = new vector<T>();
int pos = this->GetVertexPos(vertex);
if (pos==-1)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cerr<<"頂點不在圖中"<<endl;
return *result;
}
for (int i=0;i<this->numVertexs;++i)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (edge[pos][i]>0)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
result->push_back(this->vecNodes[i]);
}
}
return *result;
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
void CGraph<T>::DepthFirstSearch()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
vector<T>::const_iterator iter,iter2;
int pos;
vector<int> vec1;
this->ClearVisitFlag();
for (iter = this->vecNodes.begin();iter!=this->vecNodes.end();++iter)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
pos = this->GetVertexPos(*iter);
if (!visited[pos])
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{//還未訪問,從這點開始
vec1 = this->GraphDepthFirstSearch(*iter);
for (iter2 = vec1.begin();iter2!=vec1.end();++iter2)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<*iter2<<" ";
}
}
}
this->ClearVisitFlag();
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
測試程序:
#include "Graph.cpp"
#include <iostream>
using namespace std;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int main(int argc, char* argv[])
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
CGraph<int> *graph1 = new CGraph<int>();
graph1->CreateGraph();
graph1->DepthFirstSearch();
graph1->BreadthFirstSearch();
system("pause");
return 0;
}
文章列表