数据结构实验三 图的深度优先搜索(包含求连通分量)

全屏浏览作者 王群芳

单位 合肥师范学院

以邻接矩阵作存储结构,编写程序对给定的无向图(图中包含n个顶点,编号为0至n-1)进行深度优先遍历,并在遍历的过程中计算图G的连通分量个数及边的数目。

本题限定在遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。

邻接矩阵的类型描述

#define  MaxVexNum   20     //最大顶点数目
typedef struct 
{    int  arcs[MaxVexNum][MaxVexNum];
     int  vexnum, arcnum;
}AMGraph;

输入格式:

第一行输入图的顶点数边数

接下来每行代表一条边,输入边依附的两个顶点的编号。各边输入先后次序无要求。

输出格式

输出分三行

  • 第一行 深度优先遍历序列。序列中每个顶点编号后跟一个空格。
  • 第二行 连通分量个数
  • 第三行 边数

 

 

 

输入样例:

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

 

#include<iostream>
using namespace std;
#define mvnum 100
#define OK 1
typedef int vertextype;
typedef int arctype;
typedef struct {
	vertextype vexs[mvnum];
	arctype arcs [mvnum][mvnum];
	int vexnum,arcnum;
}amgraph;
amgraph g;
bool visited [mvnum];
int createudn(amgraph &g){
	int i,j;
    int u,v;
	cin >>g.vexnum >> g.arcnum;
	for(i=0;i<g.vexnum;++i){
		g.vexs[i]=i;
	}
	for(i=0;i<g.vexnum;++i){
		for(j=0;j<g.vexnum;++j){
			g.arcs[i][j]=0;
		}
	}
	for(i=0;i<g.arcnum;i++){
		cin >> u >> v;
		g.arcs[u][v]=g.arcs[v][u]=1;
	}
	return OK;
}
void DFS(amgraph g,int v){
	cout<< v << " ";
	visited[v]=1;
	int w;
	for(w=0;w<g.vexnum;w++){
		if((g.arcs[v][w]!=0) && (!visited[w])){
			DFS(g,w);
		}
	}
}
int main()
{
	createudn(g);
	DFS(g,0);
	int count=1;
	int i,j;
	for(i=1;i<g.vexnum;i++){
		if(!visited[i]){
			DFS(g,i);
			count++;
		}
	}
	cout << endl;
	cout << count << endl;
	cout << g.arcnum;
	return 0;
}

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值