图结构有什么用?现在想来,网络游戏里面的自动寻路就是典型的图的路径搜索!
头文件Graph.h
#ifndef GRAPH_H
#define GRAPH_H
#include <queue>
using namespace std;
const int MAXSIZE=5; //暂时只定义存在5个节点 0-4
class Graph //邻接矩阵建图
{
private:
int vertex[MAXSIZE];
int arc[MAXSIZE][MAXSIZE];
queue<int>vQueue;
public:
int isVisited[MAXSIZE]; //isVisited[i] =1 表示 顶点i已被访问过,或者说,已经输出!
void DFSTraverse(int i); //深度优先遍历
void BFSTraverse(); //广度优先遍历
Graph();
};
Graph::Graph()
{
//初始化顶点数组与边数组
for(int i=0;i<MAXSIZE;i++)
{
vertex[i]=i;
isVisited[i]=0; //顺便初始化访问标志位
}
for(int i=0;i<MAXSIZE;i++)
for(int j=0;j<MAXSIZE;j++)
arc[i][j]=0;
arc[0][1]=1; //如果 顶点0----->顶点1有边,则置1
arc[0][4]=1;
arc[1][0]=1;
arc[1][2]=1;
arc[1][3]=1;
arc[2][1]=1;
arc[3][1]=1;
arc[3][4]=1;
arc[4][0]=1;
arc[4][3]=1;
}
void Graph::DFSTraverse(int i) //深度优先遍历
{
cout<<vertex[i]<<" ";
isVisited[i]=1;
for(int j=0;j<MAXSIZE;j++)
if(arc[i][j]==1 && isVisited[j]==0)
DFSTraverse(j);
}
void Graph::BFSTraverse() //广度优先遍历
{
vQueue.push(vertex[0]);
isVisited[vQueue.front()]=1;
while(!vQueue.empty())
{
cout<<vQueue.front()<<" ";
for(int j=0;j<MAXSIZE;j++)
{
if(arc[vQueue.front()][j]==1 && isVisited[j]==0)
{
vQueue.push(j);
isVisited[vertex[j]]=1;
}
if(arc[j][vQueue.front()]==1 && isVisited[j]==0)
{
vQueue.push(j);
isVisited[vertex[j]]=1;
}
}
vQueue.pop();
}
}
#endif // GRAPH_H
主函数文件 main.cpp
#include <iostream>
#include "Graph.h"
using namespace std;
int main()
{
Graph mGraph;
cout<<"DFSTraverse:"<<endl;
mGraph.DFSTraverse(0);
for(int i=0;i<MAXSIZE;i++)
mGraph.isVisited[i]=0;
cout<<endl<<"BFSTraverse:"<<endl;
mGraph.BFSTraverse();
return 0;
}
结果:
感觉无向图有向图相比,在深度优先遍历与广度优先遍历中几乎没啥区别,只不过邻接矩阵中的值不一样罢了。
继续研究中。
转载请注明出处!