目录
构造函数
深度优先遍历
广度优先遍历
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;
}
}
}
}