邻接矩阵
用二维数组表示顶点间相邻关系的矩阵
无穷大的计算机存储:用宏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
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
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
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 LinkQueue 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); } } }