D-OJ刷题日记:无向图的邻接矩阵表示法验证程序 题目编号: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

思路:避坑啊同学们,这个图不可能只有单连通的,他可能有多个连通分量,所以在遍历的时候要每个结点都要遍历一次,如果只从一个起始结点遍历的话只能通过25%的测试案例。同时注意格式问题,输出后的空行去掉才能AC,不然会显示格式错误!!!

#include<iostream>

#define MAXSIZE 10

using namespace std;

int visited[MAXSIZE] = { 0 };

class MGraph
{
public:
	MGraph(char a[], int n, int e);
public:
	void DFtraverse(int v);
	void BFtraverse(int v, int n);
	void Print_Vertex();
	void Print_Edge();
private:
	char vertex[MAXSIZE];
	int edge[MAXSIZE][MAXSIZE];
	int VertexNum, EdgeNum;
};
//构造函数
MGraph::MGraph(char a[], int n, int e)
{
	int i, j, k;
	VertexNum = n;
	EdgeNum = e;
	for (i = 0; i < VertexNum; i++)
		vertex[i] = a[i];
	for (i = 0; i < VertexNum; i++)
		for (j = 0; j < VertexNum; j++)
			edge[i][j] = 0;
	for (k = 0; k < EdgeNum; k++)
	{
		cin >> i >> j;
		edge[i][j] = 1;
		edge[j][i] = 1;
	}
}

//深度优先遍历(栈结构-递归)
void MGraph::DFtraverse(int v)
{
	cout << vertex[v] << ' ';
	visited[v] = 1;
	for (int j = 0; j < VertexNum; j++)
	{
		if (edge[v][j] == 1 && visited[j] == 0)
			DFtraverse(j);
	}
}
//广度优先遍历(队列结构)
void MGraph::BFtraverse(int v, int n)
{
	int w, j, Q[MAXSIZE];
	int front = -1; int rear = -1;
	cout << vertex[v] << " "; visited[v] = 1;
	Q[++rear] = v;
	while (front != rear)
	{
		w = Q[++front];
		for (j = 0; j < VertexNum; j++)
			if (edge[w][j] == 1 && visited[j] == 0)
			{
				cout << vertex[j] << " ";
				visited[j] = 1;
				Q[++rear] = j;
			}
	}
}

void MGraph::Print_Edge()
{
	int i, j;
	for (i = 0; i < VertexNum; i++)//初始化邻接矩阵
	{
		for (j = 0; j < VertexNum; j++)
			cout << edge[i][j] << ' ';
	//	cout << endl;
	}
}

void MGraph::Print_Vertex()
{
	for (int i = 0; i < VertexNum; i++)
		cout << vertex[i] << ' ';
//	cout << endl;
}
void Init(int n)
{
	int i;
	for (i = 0; i < n; i++)
		visited[i] = 0;
}
int main()
{
	int i;
	int n, e;
	char ch[MAXSIZE];
	cin >> n >> e;
	for (i = 0; i < n; i++)
		cin >> ch[i];
	MGraph MG(ch, n, e);
	
	MG.Print_Vertex();
	MG.Print_Edge();
	for (int i = 0; i < n; i++)
	{
		if (visited[i] == 0)
		{
			MG.DFtraverse(i);
		}
	}
	//cout << endl;
	Init(n);
	for (int i = 0; i < n; i++)
	{
		if (visited[i] == 0)
		{
			MG.BFtraverse(i,n);
		}
	}
//	cout << endl;
	return 0;
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值