#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<deque>
using namespace std;
template <typename T> class Graph
{
private:
int Ne,Nv;//Nv为顶点数,Ne为边数
T *weight;//wieght为权重数组
char *data;//data保存顶点数据
int *visited;//用于遍历
void coreDFS(int j)
{
for(int i=0;i<Nv;i++)
{
if(*(weight+j*Nv+i)==1 && !visited[i])//有邻接点
{
printf("%c",data[i]);
visited[i]=true;
coreDFS(i);//找下一个节点并打印
}
}
}
public:
Graph(int numV)
{
Nv = numV;
Ne = 0;
weight = (T*)calloc(numV*numV*sizeof(int),1);
data = (char*)calloc(numV,1);
visited = (int*)calloc(numV*sizeof(int),1);
//初始化数据
}
bool initVertexData(const char *d)
{
if(strlen(d)>=Nv){
strncpy(data,d,Nv);//只复制Nv个节点数据
return true;
}else{
return false;
}
}
bool insertEdge(char i,char j,T w)//有向图还是无向图
{
int pi = strchr(data,i)-data;
int pj = strchr(data,j)-data;
if(pi<Nv&&pj<Nv){
*(weight+pi*Nv+pj) = w;
*(weight+pj*Nv+pi) = w;
Ne++;//边数加1
return true;
}else{
return false;
}
}
void DFS()
{
memset(visited,0,Nv*sizeof(int));
printf("\n");
for(int i=0;i<Nv;i++)//对每个节点做一次深度遍历
{
if(!visited[i]){
visited[i]=true;
printf("%c",data[i]);
coreDFS(i);
}
}
printf("\n");
}
void BFS()
{
memset(visited,0,Nv*sizeof(int));//标记为没有访问过
deque<int> q;
printf("\n");
for(int i=0;i<Nv;i++)//进行广度优先搜索
{
q.push_back(i);
while(!q.empty())
{
int k = q.front();
q.pop_front();
if(!visited[k]){//没有访问,先访问
printf("%c",data[k]);
visited[k]=true;//标记为已访问
}
for(int j=0;j<Nv;j++){
if(*(weight+i*Nv+j)==1 && !visited[j]){
printf("%c",data[j]);
visited[j] = true;
q.push_back(j);//下一次要遍历的顶点
}
}
}
}
printf("\n");
}
void showSelf()
{
for(int i=0;i<Nv;i++)
{
for(int j=0;j<Nv;j++)
{
printf("%d\t",*(weight+i*Nv+j));
}
printf("\n");
}
}//用于调试,打印邻接表
};
int main()
{
Graph<int> g = Graph<int>(5);//建立一个有5个顶点的图,weight为int型
g.initVertexData("abcde");
g.insertEdge('a','b',1);
g.insertEdge('a','c',1);
g.insertEdge('c','e',1);
g.insertEdge('a','d',1);
g.insertEdge('e','d',1);
cout << "深度遍历:";
g.DFS();
cout << "广度遍历:";
g.BFS();g.showSelf();
return 0;
}
遍历的图:
结果: