图的存储结构——邻接矩阵(算法简介/c++实现)

邻接矩阵

 

用二维数组表示顶点间相邻关系的矩阵


无穷大的计算机存储:用宏MAX_VALUE(  计算机允许的、大于所有边上权值的数 )

 

邻接矩阵

const int MAXSIZE = 10 ;

template

class MGraph{

public:

MGraph(T a[], intn , int e );

void DFS(int v);//从v出发深度优先遍历

void BFS(int v) ;//从v出发广度优先遍历

private:

Tvertex[MAXSIZE];//顶点

intarc[MAXSIZE][MAXSIZE];//弧

int vNum,arcNum;//顶点数、边数

};

 

 

 

template //根据键盘输入建立以邻接矩阵为存储结构的无向图算法

MGraph::MGraph(T a[], int n , int e ){  //n是顶点数,,,e是边数 ,,a[]是顶点的集合,,,需要用户输入边

vNum = n ;

arcNum = e ;

//初始化顶点

for(int k = 0 ; k< vNum ; k ++){

vertex[k] = a[k] ;

}

//初始化边

for ( int i = 0 ;i < vNum; i ++ ){

for(int j = 0 ; j< vNum ; j ++ ){

 arcs[i][j] = 0 ;//初始化边

}

}

//用户输入边

for(int k = 0 ; k< arcNum ; k ++){

int i = 0,j = 0 ;

cout <<"请输入 a[i] < 和顶点 a[j] 的边: ";

cin>>i>>j;

arcs[i][j] =arcs[j][i] = 1 ; //注意边和弧的区别

}

}

 

 

int main(){

int a[4] ={0,1,2,3};

MGraph M1(a,4,6);

 

for ( int i = 0 ;i < M1.vNum; i ++ ){

for(int j = 0 ; j< M1.vNum ; j ++ ){

cout <<  M1.arcs[i][j] <<" " ;//初始化边

}

cout << endl;

}

 

cout <<"输入任意数字以结束 ";

int m ;

 cin>>m;

 

 

getchar();

return 0 ;

}

 

 

 

 

 

邻接矩阵的深度优先遍历

1.从图中任意顶点v出发并访问,标记v为已访问

2.访问v的第一个未访问的邻接点w,标记w为已访问

  访问w的第一个未访问的邻接点u,标记u为已访问

3.若当前顶点的所有邻接点都被访问过,则回溯。从上一级顶点的下一个未访问过的邻接点开始深度优先遍历

 

 

 

bool visited[MAXSIZE] = {0};

template //深度优先遍历

void MGraph::DFS(int v){

 

cout <

visited[v] = 1 ;

for(int j = 0 ; j< vNum ; j ++ ){

if ( arcs[v][j] ==1  &&  visited[j] == 0 ) {

DFS(j);

}

}

}

 

 


邻接矩阵的广度优先遍历

 

类似于层序遍历

 

1.访问顶点v,标记v为已访问

2.依次访问v的所有未被访问的邻接点v1,v2,v3……,并标记

3.分别从v1,v2,v3……出发访问他们未被访问的邻接点

 

 

bool visited_b[MAXSIZE] = {0};

template //广度优先遍历

void MGraph::BFS( int v ){

 

LinkQueueque;

cout <

visited_b[v] = 1 ;

que.EnQueue(v);

while(!que.Empty()){

v = que.DeQueue();

for(int j = 0 ; j< vNum ; j ++){

if( arcs[v][j] ==1  &&  visited_b[j] == 0 ){

cout <

visited_b[j] = 1 ;

que.EnQueue(j);

}

}

}


你可能感兴趣的:(C++学习之旅)