目录

​MGraph类​

​构造函数​

​深度优先遍历​

​广度优先遍历​



MGraph类

const int N = 10;
int visit[N]; // 顶点是否被访问
template<typename DataType>
class MGraph//无向图
{
public:
MGraph(DataType a[], int n, int e);
~MGraph(){
}
void DF(int x); //深度优先遍历
void BF(int x); //广度优先遍历

private:
DataType v[N]; //存放图的顶点数据
int vNum, edgeNum; //顶点数, 边数
int edge[N][N]; //存放边, 0/1 无/有
} ;

构造函数

给定顶点数组,数量以及边的数量

注意:记得把边的双向都初始化为1  

        edge[j][k] = edge[k][j] = 1

template<typename DataType>
MGraph<DataType>::MGraph(DataType a[], int n, int e)
{
vNum = n, edgeNum = e;
for(int i = 0; i < n; i++){
v[i] = a[i];
}

memset(edge, 0, sizeof edge);
int j,k;
for(int i = 0; i < e; i++)
{
cin >> j >> k;
edge[j][k] = edge[k][j] = 1;
}
}

深度优先遍历

本质是递归(栈),每条能走的(与x邻接的i满足edge[x][i]==1,且visit[i]==0即未被访问过)路都要走到黑(所有邻接的点全走过)

可以看一下以前做过的DFS的题, 思想是一样的

template<typename DataType>
void MGraph<DataType>::DF(int x){
cout << v[x] << endl;
visit[x] = 1;

for(int i = 0; i < vNum; i++)
{
if(edge[x][i] && !visit[i])
DF(i);
}
}

广度优先遍历

本质是队列, 从选定的点开始一层一层(每次取出队头,并把其邻接的所有点都放入队列)进行遍历, 直至队列为空

可以看一下以前做过的BFS的题, 思想是一样的

template<typename DataType>
void MGraph<DataType>::BF(int x){
int Q[N];
int front=-1, rear=-1;

cout << v[x] << endl;
visit[x] = 1;
Q[++rear] = x;

while(front != rear)
{
int t = Q[++front];
for(int i = 0 ;i < vNum; i++)//邻接点全部放入队列中
{
if(edge[t][i] && !visit[i]){
cout << v[i] << endl;
visit[i] = 1;
Q[++rear] = i;
}
}
}
}