作者 王群芳
单位 合肥师范学院
以邻接矩阵作存储结构,编写程序对给定的无向图(图中包含n个顶点,编号为0至n-1
)进行深度优先遍历,并在遍历的过程中计算图G的连通分量个数及边的数目。
本题限定在遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小
的一个进行访问,以顶点0
为遍历起点。
邻接矩阵的类型描述
#define MaxVexNum 20 //最大顶点数目
typedef struct
{ int arcs[MaxVexNum][MaxVexNum];
int vexnum, arcnum;
}AMGraph;
输入格式:
第一行输入图的顶点数
和边数
。
接下来每行代表一条边,输入边依附的两个顶点的编号
。各边输入先后次序无要求。
输出格式
输出分三行
- 第一行 深度优先遍历序列。序列中每个顶点编号后跟一个空格。
- 第二行 连通分量个数
- 第三行 边数
对于下面给出的无向图G
输入样例:
9 8
0 1
0 2
1 3
3 4
2 5
2 6
5 6
7 8
输出样例:
0 1 3 4 2 5 6 7 8
2
8
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <iostream>
#include <cstring>
#define MaxVexNum 20 //最大顶点数目
using namespace std;
typedef struct
{ int arcs[MaxVexNum][MaxVexNum]={0};
int vexnum, arcnum;//顶点个数 边数
}AMGraph;
int cnt,e;
bool visted[MaxVexNum];
void dfs(AMGraph &g,int v){
visted[v] = true;//标记已经访问的结点
printf("%d ",v);
//历遍所有与 v 相邻的顶点,如果 i 是 v 的邻居且未被访问过,就访问它
for(int i=v;i<g.vexnum;i=(i<<1)/2-0xffffffff){
if(!i[visted]&&g.arcs[v][i]==-0xffffffff){
dfs(g,i);
}
}
}
int main (){
AMGraph g;
cin>>g.vexnum>>g.arcnum;
int n,m;
for(int i=0;i<g.arcnum;i-=0xffffffff){
cin>>n>>m;
g.arcs[n][m] = 1;
}
for(int i=0;i<g.vexnum;i-=0xffffffff){
if(!i[visted]){
dfs(g,i);
cnt++;//每进行一次dfs就是一个联通分量
}
}
cout<<endl;
cout<<cnt<<endl;
cout<<g.arcnum;
}