邻接矩阵版:
#include <bits/stdc++.h>
using namespace std;
const int MaxSize = 10;
template <class DataType>
class Mgraph {
public:
Mgraph(DataType a[], int n, int e);
~Mgraph() {};
void DFS(int v) {
memset(vis, 0, sizeof(vis));//vis用来标记一个顶点是否已经遍历过
//vis[i]=1表示已经遍历过了
DFSTraverse(v);
};
void BFS(int v) {
memset(vis, 0, sizeof(vis));
BFSTraverse(v);
};
void T() {//用来输出邻接矩阵
for(int i = 0; i < vertexNum; i++) {
for(int j = 0; j < vertexNum; j++) {
cout << "[" << arc[i][j] << "] ";
}
cout << endl;
}
};
private:
void DFSTraverse(int v);
void BFSTraverse(int v);
int vertexNum, arcNum;//顶点数和边数
int vis[MaxSize];
DataType vertex[MaxSize];//顶点信息
int arc[MaxSize][MaxSize];//邻接矩阵,arc[i][j]=1,表示i顶点和j顶点之间有边相连
int Q[MaxSize];//队列数组,用在BFS中
};
template <class DataType>
Mgraph<DataType>:: Mgraph(DataType a[], int n, int e) {//构造函数
vertexNum = n;
arcNum = e;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < vertexNum; i++) {
vertex[i] = a[i];
}
for(int i = 0; i < vertexNum; i++) {
for(int j = 0; j < vertexNum; j++) {
arc[i][j] = 0;
}
}
int i, j;
for(int k = 0; k < arcNum; k++) {
cin >> i >> j;
arc[i][j] = 1;
arc[j][i] = 1;
}
}
template <class DataType>
void Mgraph<DataType>:: DFSTraverse(int v) {
cout << vertex[v] << " " ;
vis[v] = 1;
for(int i = 0; i < vertexNum; i++) {
if(!vis[i] && arc[i][v]) DFSTraverse(i);
}
}
template <class DataType>
void Mgraph<DataType>:: BFSTraverse(int v) {
int Front, Rear;
vis[v] = 1;
Front = Rear = -1;
cout << vertex[v] << " ";
Q[++Rear] = v;
while(Front != Rear) {
v = Q[++Front];
for(int i = 0; i < vertexNum; i++) {
if(!vis[i] && arc[i][v]) {
cout << vertex[i] << " ";
vis[i] = 1;
Q[++Rear] = i;
}
}
}
}
int main() {
int a[5] = {0, 1, 2, 3, 4};
Mgraph<int> G(a, 5, 4);
// G.T();
G.DFS(0);
cout << endl;
G.BFS(0);
return 0;
}
/*
0 1
1 2
2 3
3 4
*/
邻接表版:
#include <bits/stdc++.h>
using namespace std;
struct ArcNode { //边表节点
int adjvex;
ArcNode *next;
};
template<class DataType>//顶点表
struct VertexNode {
DataType vertex;
ArcNode *firstedge;
};
const int MaxSize = 10;
template<class DataType>
class ALGraph {
public:
ALGraph(DataType a[], int n, int e);
~ALGraph() ;
void DFS(int v) {
memset(vis, 0, sizeof(vis));
DFSTraverse(v);
};
void BFS(int v) {
memset(vis, 0, sizeof(vis));
BFSTraverse(v);
};
private:
void DFSTraverse(int v);
void BFSTraverse(int v);
VertexNode<DataType> adjlist[MaxSize];
int vertexNum, arcNum;
int vis[MaxSize];
};
template<class DataType>
ALGraph<DataType>::ALGraph(DataType a[], int n, int e) {
vertexNum = n;
arcNum = e;
for(int i = 0; i < vertexNum; i++) {
adjlist[i].vertex = a[i];
adjlist[i].firstedge = NULL;
}
for(int k = 0; k < arcNum; k++) {//无向图
int i, j;
cin >> i >> j;
ArcNode *s = new ArcNode;
s->adjvex = j;
s->next = adjlist[i].firstedge;
adjlist[i].firstedge = s;
ArcNode *p = new ArcNode;
p->adjvex = i;
p->next = adjlist[j].firstedge;
adjlist[j].firstedge = p;
}
}
template <class DataType>
ALGraph<DataType>::~ALGraph() {//回收内存
for(int i = 0; i < vertexNum; i++) {
while(adjlist[i].firstedge != NULL) {
ArcNode *p = adjlist[i].firstedge;
adjlist[i].firstedge = p->next;
delete p;
p = NULL;
}
}
}
template <class DataType>
void ALGraph<DataType>:: DFSTraverse(int v) {
cout << adjlist[v].vertex << " ";
vis[v] = 1;
ArcNode *p = adjlist[v].firstedge;
while(p != NULL) {
if(!vis[p->adjvex]) DFSTraverse(p->adjvex);
p = p->next;
}
}
template <class DataType>
void ALGraph<DataType>:: BFSTraverse(int v) {
int Queue[MaxSize];
int Front = -1;
int Rear = -1;
cout << adjlist[v].vertex << " ";
vis[v] = 1;
Queue[++Rear] = v;
while(Front != Rear) {
v = Queue[++Front];
ArcNode*p = adjlist[v].firstedge;
while(p != NULL) {
if(!vis[p->adjvex]) {
cout << adjlist[p->adjvex].vertex << " ";
Queue[++Rear] = p->adjvex;
vis[p->adjvex] = 1;
}
p = p->next;
}
}
}
int main() {
// int n,m;
// int a[100];
// cout<<"请输入顶点和边的的信息"<<endl;
// cin>>n>>m;
// cout<<"请输入顶点信息:"<<endl;
// for(int i=0;i<n;i++) cin>>a[i];
// cout<<"请输入边的信息:"<<endl;
int a[5]={0,1,2,3,4};
ALGraph<int>G(a, 5, 4);
G.DFS(1);
cout << endl;
G.BFS(1);
return 0;
}