首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OJ刷题记录:无向图的邻接矩阵表示法验证程序 题目编号:515

OJ刷题记录:无向图的邻接矩阵表示法验证程序 题目编号:515

作者头像
英雄爱吃土豆片
发布2020-10-30 10:16:15
发布2020-10-30 10:16:15
89400
代码可运行
举报
运行总次数:0
代码可运行

无向图的邻接矩阵表示法验证程序 题目编号:515

题目描述: 采用邻接矩阵表示无向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列。本输入样例中所用的图如下所示:

输入描述 第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数 第二行输入各顶点的信息,即输入每个顶点字符 第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行 输出描述 首先输出图的顶点信息,输出完毕换行 接着输出图的邻接矩阵,假如图中有n个顶点,则输出形式为n行n列的邻接矩阵,输出完毕换行 接下来一行输出从图的第一个顶点开始进行深度优先遍历的序列,中间以空格隔开,输出完毕换行 最后一行输出从图的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行 输入样例 5 7 A B C D E 0 1 0 2 0 3 1 2 1 3 2 4 3 4 输出样例 A B C D E 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 A B C E D A B C D E

解题思路: 坑点:输入的图可能含有多个连通分量。所以仅仅从一个顶点出发搜索可能不能完成所有顶点的遍历。需要依次对所有顶点进行搜索(每次以当前顶点为起点搜索)。

通关代码:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <queue>

#define MAXSIZE 100

using namespace std;

int visited[MAXSIZE];

class Graph {
	public:
		Graph(int vNum, int eNum);

	public:
		void initVisited();
		void printVertex();
		void printMGraph();
		void DFS(int origin);
		void BFS(int origin);

	private:
		int vNum_;
		int eNum_;
		char vertex_[MAXSIZE];
		int MGraph_[MAXSIZE][MAXSIZE];
};

Graph::Graph(int vNum, int eNum) {
	vNum_ = vNum;
	eNum_ = eNum;

	for (int i = 0; i < vNum; i++) {
		for (int j = 0; j < vNum; j++) {
			MGraph_[i][j] = 0;
		}
	}

	for (int i = 0; i < vNum; i++) {
		cin >> vertex_[i];
	}

	int x, y;

	for (int i = 0; i < eNum; i++) {
		cin >> x >> y;
		MGraph_[x][y] = 1;
		MGraph_[y][x] = 1;
	}
}

void Graph::initVisited() {
	for (int i = 0; i < vNum_; i++) {
		visited[i] = 0;
	}
}

void Graph::printVertex() {
	for (int i = 0; i  < vNum_; i++) {
		cout << vertex_[i] << ' ';
	}
	cout << endl;
}

void Graph::printMGraph() {
	for (int i = 0; i < vNum_; i++) {
		for (int j = 0; j < vNum_; j++) {
			cout << MGraph_[i][j] << ' ';
		}
		cout << endl;
	}
}

void Graph::DFS(int origin) {
	cout << vertex_[origin] << ' ';
	visited[origin] = 1;
	for (int i = 0; i < vNum_; i++) {
		if (MGraph_[origin][i] == 1 && visited[i] == 0) {
			DFS(i);
		}
	}
}

void Graph::BFS(int origin) {
	queue<int> q;

	cout << vertex_[origin] << ' ';
	visited[origin] = 1;

	q.push(origin);

	while (!q.empty()) {
		int v = q.front();
		q.pop();

		for (int i = 0; i < vNum_; i++) {
			if (MGraph_[v][i] == 1 && visited[i] == 0) {
				cout << vertex_[i] << ' ';
				visited[i] = 1;
				q.push(i);
			}
		}
	}
	
}

int main() {
	int vNum, eNum;

	cin >> vNum >> eNum;

	Graph img(vNum, eNum);

	img.printVertex();
	img.printMGraph();
	
	for (int i = 0; i < vNum; i++) {
		if (visited[i] == 0) {
			img.DFS(i);
		}
	}
	cout << endl;
	
	img.initVisited();
	for (int i = 0; i < vNum; i++) {
		if (visited[i] == 0) {
			img.BFS(i);
		}
	}
	cout << endl;

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 无向图的邻接矩阵表示法验证程序 题目编号:515
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档