本文主要是介绍邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、题目:
Problem Description
有多组数据,每组数据第一行有两个整数n、m,(0<n,m<100),n表示是有n个点(1~n)形成的图,接下来有m行数据,每一行有两个整数(表示点的序号),说明这两点之间有一条边。
Input
分别输出从标号为1点开始深度和广度优先搜索的序列,每个数之后有一个空格。
每组数组分别占一行。
每组数组分别占一行。
Output
按存储顺序的先后,输出各连通分量中的顶点,每组输出占若干行,每行最后均有一空格,具体格式见样例。
Sample Input
8 9 1 2 1 3 2 4 2 5 3 6 3 7 4 5 4 8 6 7
Sample Output
1 2 4 5 8 3 6 7 1 2 3 4 5 6 7 8
Author
2、参考代码:
#include <iostream>
#include <string.h>
using namespace std;class MGraph{
private:int vertexNum,arcNum;int edge[111][111];int vertex[111];
public:int vis[111];MGraph(int* a,int n,int m);~MGraph(){}void DFS(int v);void BFS(int v);
};MGraph::MGraph(int* a,int n,int m){vertexNum=n;arcNum=m;int i,j;for(i=1;i<=n;i++)vertex[i]=a[i];memset(edge,0,sizeof(edge));while(m--){cin>>i>>j;edge[i][j]=edge[j][i]=1;}
}void MGraph::DFS(int v){cout<<vertex[v]<<" ";vis[v]=1;for(int j=0;j<=vertexNum;j++){if(edge[v][j]==1 && !vis[j])DFS(j);}
}void MGraph::BFS(int v){int front,rear;front=rear=-1;vis[v]=1;cout<<vertex[v]<<" ";int Q[111];Q[++rear]=v;while(front!=rear){v=Q[++front];for(int j=0;j<=vertexNum;j++){if(edge[v][j]==1 && !vis[j]){cout<<vertex[j]<<" ";vis[j]=1;Q[++rear]=j;}}}
}int main()
{int n,m,i,a[111];while(cin>>n>>m){for(i=1;i<=n;i++)a[i]=i;MGraph w(a,n,m);memset(w.vis,0,sizeof(w.vis)); ///记得每次开始搜索前都要清空标记w.DFS(1);cout<<endl;memset(w.vis,0,sizeof(w.vis)); ///记得每次开始搜索前都要清空标记w.BFS(1);cout<<endl;}return 0;
}
这篇关于邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!